試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

バージョン1.2.12系以上のopenBVEのユーザごとのデータ保存ディレクトリについてとシミュレータ開始後に正常にメインウィンドウに戻らない場合の対処(前半)

openBVEのバージョン1.2.12系(開発版は1.2.11系)からは設定ファイル群は各ユーザごとの設定ディレクトリに保存されるようになっている。これはMonoや.NET Frameworkの基本クラスライブラリにおけるSystem.Environment.SpecialFolder.ApplicationDataの値に基づいており、GNU/Linux上のMonoでは${XDG_CONFIG_HOME}/以下(環境変数XDG_CONFIG_HOMEが未定義の場合は${HOME}/.config/以下)にopenBVEというディレクトリが作られてその中のサブディレクトリに設定ファイルが保存されることになっている。WindowsではOSのバージョンによってC:\Documents and Settings\[ユーザ名]\Application Data\[Windows XPなど],C:\Users\[ユーザ名]\AppData\Roaming\(もしくはこれを指し示すジャンクション*1C:\Users\[ユーザ名]\Application Data\)[Windows 7など]のような場所の下になるらしい(実際のWindows上では未確認・OSはCドライブに入っているものとする)。

保存ディレクトリの確認ツールを作成

下のBoo言語のコードを用いるとこの設定ディレクトリを確認できる(実行にはBooが必要)。実行時の環境変数XDG_CONFIG_HOMEによって出力は変わる。
[任意]ファイル名: openbveuserdir.boo ライセンス: CC0

#! /usr/bin/booi
# CC0

import System

print (IO.Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), 'openBVE'))

下は実行結果。

$ env -u XDG_CONFIG_HOME [openbveuserdir.booの場所]
/home/[ユーザ名]/.config/openBVE
$ XDG_CONFIG_HOME=/foo/bar [openbveuserdir.booの場所]
/foo/bar/openBVE

下はWindows FormsのGUI上でSystem.Environment.SpecialFolder.ApplicationDataのディレクトリとopenBVEのユーザごとのデータ保存ディレクトリをPropertyGridというGUI部品に表示するコードとなる。
[任意]ファイル名: openbveuserdir_forms.boo ライセンス: CC0

#! /usr/bin/booi
# -*- coding: utf-8 -*-

# Environment.SpecialFolder.ApplicationDataとopenBVEのユーザごとのデータ保存ディレクトリを
# Windows FormsのPropertyGridに表示する
# CC0

import System.Windows.Forms
import System


class Dirs:
"""
ディレクトリ情報
OS,ApplicationData,openBVEUserDirの3つのプロパティから成る
"""
  # 「[Property ([プロパティ名])] [データ格納メンバ] as [型] = [初期値]」で
  # 自動実装プロパティ(既定のgetter/setterを持つプロパティ)が定義できる
  # OS情報
  [Property (OS)]
  _os as string = Environment.OSVersion.VersionString
  # ApplicationDataのディレクトリ情報
  [Property (ApplicationData)]
  _appdata as string = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData)
  # openBVEのユーザごとのデータ保存ディレクトリ情報
  [Property (openBVEUserDir)]
  _openbve as string = IO.Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), 'openBVE')

class DirsPropertyGrid (PropertyGrid):
"""
ディレクトリ情報を表示するPropertyGrid
"""
  def constructor ():
    self.SelectedObject = Dirs ()                   # プロパティ内容を表示するオブジェクト
    self.Dock = DockStyle.Fill                      # スペースを占める/サイズ変更に対応
    self.ToolbarVisible = self.HelpVisible = false  # PropertyGridのツールバーとヘルプを隠す
    self.PropertySort = PropertySort.NoSort         # 並べ替えを無効化

class DisplayOpenBveUserDirForm (Form):
"""
Environment.SpecialFolder.ApplicationDataのディレクトリと
openBVEのユーザごとのデータ保存ディレクトリ情報を表示するフォーム
"""
  def constructor ():
    self.Text = 'Display openBVE userdata directory'  # ウィンドウタイトル
    self.Controls.Add (DirsPropertyGrid ())           # 子にPropertyGridを入れる
    self.Width = 500                                  # 幅


Application.Run (DisplayOpenBveUserDirForm ())

これをGNU/Linux上(GNU/Linux版Mono)で動かすと

のようになった(環境変数XDG_CONFIG_HOMEが未定義の場合)。OS名は「Unix [カーネルのバージョン]」と表示される(GNU/Linux,BSD,UNIXなどは区別されずにOS名は「Unix」となる仕様)。
Windows上での動作の参考として、Wine上のWindows版Monoで動かすと

のようになった。

(「バージョン1.2.12系以上のopenBVEのユーザごとのデータ保存ディレクトリについてとシミュレータ開始後に正常にメインウィンドウに戻らない場合の対処(後半)」に続く)

関連記事:

使用したバージョン:

  • openBVE 1.2.12.2
  • Boo 0.9.4.9

*1:制限のあるシンボリックリンクのようなもの