2012年4月4日水曜日

iOS 標準ディレクトリパスの取得

OS標準ディレクトリパスの取得方法です。標準ディレクトリはアプリケーション単位で作成される ディレクトリ(ホームディレクトリ)配下に作成されるサブディレクトリの事です。 サブディレクトリはそれぞれ用途が決まっており、このディレクトリ単位でiTunesバックアップの 対象になるかも決定されます。 詳細はこちら(リファレンス)
日本語訳を以下に貼りつけておきます。
iOSアプリケーションの標準ディレクトリ

ディレクトリ 解説
<Application_Home> / AppName .app これはアプリケーション自体を含む、バンドルのディレクトリです。こ のディレクトリには何も書き込まないでください。改ざんを防止する ために、バンドルディレクトリはインストール時に署名されます。こ のディレクトリに書き込みをすると署名が変化するため、アプリケー ションを再度起動することができなくなります。iOS 2.1以降では、このディレクトリの内容がiTunesによってバックアッ プされません。ただし、App Storeから購入したアプリケーションの最 初の同期はiTunesによって実行されます。
<Application_Home> /Documents このディレクトリは、ユーザドキュメントやアプリケーションデータファイルを保存する場合に使用します。このディレクトリの内容は、ファイル共有によりユーザからのアクセスが可能になります。このディレクトリの内容はiTunesによってバックアップされます。
<Application_Home> /Documents/Inbox このディレクトリは、外部エンティティからアプリケーションに対し て要求されたファイルのアクセスに使用します。特に、「メール(Mail)」 プログラムは、アプリケーションに関連した電子メール添付ファイル をこのディレクトリに保存します。Document Interaction Controllersも ファイルを同じディレクトリに配置する場合があります。アプリケーションはこのディレクトリのファイルの読み取りと削除が可能ですが、新しいファイルの作成または既存のファイルへの書き込みは実行できません。ユーザがこのディレクトリのファイルの編集を試みた場合、アプリケーションが暗黙的にディレクトリからファイルを移動しなければ変更を行うことができません。このディレクトリの内容はiTunesによってバックアップされます。
<Application_Home> /Library/ このディレクトリは、ユーザのデータファイル以外のファイル用の最上位ディレクトリです。通常、いくつかの標準的なサブディレクトリにファイルを保存しますが、ユーザに公開しないバックアップファイル用にカスタムサブディレクトリを作成することもできますこのディレクトリは、ユーザのデータファイル用には使用しないでください。このディレクトリの内容はiTunesによってバックアップされます(ただ し、Cachesサブディレクトリは除く)。
<Application_Home> /tmp/ このディレクトリは、アプリケーションを次に起動するまで保持する 必要のない一時ファイルを書き込むために使用します。アプリケーショ ンは、これらのファイルが不要になったと判断したら、このディレク トリから削除する必要があります(アプリケーションが実行されてい ないときに、システムが古いファイルをこのディレクトリから削除す る場合もあります)。iOS 2.1以降では、このディレクトリの内容がiTunesによってバックアッ プされません。

iOSアプリケーションの標準ディレクトリの取得

・結果をNSURLクラスで取得したい場合
    //NSFileManagerシングルトンインスタンス取得
    NSFileManager *manager = [NSFileManager defaultManager];
    //NSURLが格納された配列が取得される。
    NSArray* paths = [manager URLsForDirectory:NSDocumentDirectory
                                     inDomains:NSUserDomainMask];
    if ([paths count] >= 1) {
        //配列に1件以上格納されている場合は、0番目のデータを取得
        NSURL* url = [paths objectAtIndex:0];
        NSLog(@"%@", [url path]);
    }

・結果を文字列で取得したい場合
    //クラスメソッドでは無く、ファンクション(C言語の関数)であることに注意。引数の指定方法が異なります。
    NSArray *documentPaths = 
        NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    if ([documentPaths count] >= 1) {
        NSString *documentPath = [documentPaths objectAtIndex:0];
        NSLog(@"%@", documentPaths);
    }

上記2つのメソッド(URLsForDirectory)とファンクション(NSSearchPathForDirectoriesInDomains)の第一引数に指定している定数を 変更することで取得されるパスを指定しており、上記例は「NSDocumentDirectory」が指定されているので、「Documents」への パスが取得されることになります。
以下にENUM定義を抜粋しておきます。各値がどのディレクトリに対応するかについてはこちらを参照願います。
enum {
    NSApplicationDirectory = 1,
    NSDemoApplicationDirectory,
    NSDeveloperApplicationDirectory,
    NSAdminApplicationDirectory,
    NSLibraryDirectory,
    NSDeveloperDirectory,
    NSUserDirectory,
    NSDocumentationDirectory,
    NSDocumentDirectory,
    NSCoreServiceDirectory,
    NSAutosavedInformationDirectory = 11,
    NSDesktopDirectory = 12,
    NSCachesDirectory = 13,
    NSApplicationSupportDirectory = 14,
    NSDownloadsDirectory = 15,
    NSInputMethodsDirectory = 16,
    NSMoviesDirectory = 17,
    NSMusicDirectory = 18,
    NSPicturesDirectory = 19,
    NSPrinterDescriptionDirectory = 20,
    NSSharedPublicDirectory = 21,
    NSPreferencePanesDirectory = 22,
    NSItemReplacementDirectory = 99,
    NSAllApplicationsDirectory = 100,
    NSAllLibrariesDirectory = 101
};
typedef NSUInteger NSSearchPathDirectory;

0 件のコメント :

コメントを投稿