読者です 読者をやめる 読者になる 読者になる

Q. Vala でディレクトリ作成するのどうやるの?

FAQ vala

ModeDevelop.Startup.MonoDevelopMain#EnableFileLogging メソッドにこのようなコード*1があって、これを Vala に変換したいとしよう。

string config_path = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
config_path = Path.Combine( configPath, "MonoDevelop" );
if ( !Directory.Exists( config_path ) )
    Directory.CreateDirectory( config_path );

現在ログインしているユーザーの Application Data ディレクトリに MonoDevelop というディレクトリを作成するというコードだ。
もちろん、MonoDevelop ディレクトリが存在する場合は作成しない。

まずは、「現在ログインしているユーザーの Application Data ディレクトリ」からいこう。
これは、Debian では ~/.config だった。
Vala では、GLib.Environment.get_user_config_dir メソッドを使って取得する。
驚くことに、GLib.Environment はクラスかと思いきや、なんと名前空間なのだ。
Vala は C++ のように名前空間上にでもメソッドを書けるので、main 関数を C/C++ のようにクラスの外で記述することだってできる。

次は、"~/.config" に "MonoDevelop" をくっつけて、"~/.config/MonoDevelop" というパスを作成する API
これは文字列を足していけばいいと思うかもしれないが、ファイルパスを作成するための便利なメソッドがあるので、それを使うべきだ。
この目的に使うメソッドに関しては、Vala の方が少し上手で、セパレーターとくっつけるディレクトリ名をどんどん渡していくとパスができてしまうというもの。
それが、GLib.Path.build_path メソッドだ。

その次は、先程作成したパスが存在するかどうか調べるという API だが、それというものが見つからなかったので、一番それっぽい API を使ってみた。
GLib.FileUtils.test というのがそれだ。

最後はディレクトリを作成する API だ。
この場合では、"~/.config/MonoDevelop" を作成する必要があるので、"~/.config" がない場合も考えて、`mkdir -p' 相当の API でなければダメっぽい。
ということで、GLib.DirUtils.create_with_parents メソッドを使う。

出来上がったのがこちら:

string config_path = Environment.get_user_config_dir();
config_path = Path.build_path( Path.DIR_SEPARATOR_S, config_path, "ValaDevelop" );
if ( !FileUtils.test( config_path, FileTest.EXISTS ) )
    DirUtils.create_with_parents( config_path, 0777 );

*1:変数名などは変えている