アプリケーションの存在する
ディレクトリを取得するには?


現在作っているアプリケーションで、アプリケーションの実行ファイルの存在するディレクトリと同じディレクトリに存在するファイルを参照することを考えています。

そこでどうすれば取得できるをを考えてみたのですが、Windowsの場合、シュートカットで明に作業ディレクトリを指定して起動しない限り(DOS窓からの起動は除く)デフォルトのカレントディレクトリは実行ファイルの存在するディレクトリになっているので、Cocoa環境での起動時のカレントディレクトリがどうなっているのか調べて見ました。

DarwinレベルのAPIであるgetcwd()で実験して見たのですが、Xcodeから実行させた場合は実行ファイルの作成される"build"ディレクトリになっているのですが、Finderから起動させるとなんとルート("/")になっており、カレントディレクトリは使用できないことがわかりました。(後から調べたらカレントディレクトリ取得はNSFileManagerのcurrentDirectoryPathメソッドで取得できましたね。仕事でUNIXの開発を長くやっているのでついgetcwd()を使ってしまいました。)

NSFileManagerやNSApprication、NSWorkspaceを調べて見ましたがそれらしいメソッドは見つからず悩んでおりました。そんなときmacosx-dev-jpメーリングリストでアプリケーションのリソース内に配置した独自のファイルのパスの求め方が質問として上がっており、その解決策として、以下のコードが提示されていました。

[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:相対パス];

NSBundleが使えそうな感じなので[[NSBundle mainBundle] resourcePath]で取得できる内容を確認してみました。その結果、以下のようなパスが通知されることがわかりました。

  /...../hogehoge/XXXX.app/Contents/Resources

XXXX.appがアプリケーションの名前になります。NSBundleをもう少し調べてみたところ、以下の方法でパッケージ化されているアプリケーションのディレクトリを求めることがわかりました。

[[NSBundle mainBundle] bundlePath];

この方法だと以下のパスが取得できます。

  /...../hogehoge/XXXX.app

これから"XXXX.app"を取り除けばアプリケーションの存在するディレクトリとなります。

以上をまとめたコードを以下に示しますので、ご参考にしてください。


// 自アプリケーションのディレクトリ取得
NSString *Util_GetMyAppDirectory( void )
{
    // メインバンドルのパスを取得
    // ↓以下のような値が取得される
    //  "/...../hogehoge/XXX.app"
    NSString *pstrBundlePath = [[NSBundle mainBundle] bundlePath];

    // "XXX.app"を除いたパスを通知
    return [pstrBundlePath stringByDeletingLastPathComponent];
}

【作成・確認環境】
Mac OS X v10.3.8
Xcode v1.5


一覧に戻る