libro
www.tuyano.com
初心者のためのObjective-Cプログラミング入門

NSFileManagerとファイル操作 (3/6)

作成:2011-02-21 10:15
更新:2011-11-13 21:42

■NSFileManagerとファイルの操作

ファイルの操作を行う場合、「NSFileManager」というクラスを利用します。これは、文字通りファイルを管理するための機能を提供するクラスです。利用の際には、まずデフォルトのNSFileManagerインスタンスを取得します。
NSFileManager* manager = 
    [NSFileManager defaultManager];

これで取得したインスタンスからメソッドを呼び出してファイルの操作を行います。とりあえず、「ファイルのコピー」「移動」「削除」といった基本的な操作を覚えれば、ずいぶんと使えるようになるでしょう。

◯ファイルのコピー
BOOL 変数 = [《NSFileManager*》 copyItemAtPath:《NSString*》
        toPath:《NSString*》 error:《NSError**》];

◯ファイルの移動
BOOL 変数 = [《NSFileManager*》 moveItemAtPath:《NSString*》
        toPath:《NSString*》 error:《NSError**》];

◯ファイルの削除
BOOL 変数 = [《NSFileManager*》 removeItemAtPath:《NSString*》
        error:《NSError**》];
ファイルのコピー・移動は、もとのファイルのパスと、コピーおよび移動先のパスの両方をNSStringで指定します。削除は、削除するファイルのパスを指定するだけです。

いずれも最後にerror:という引数が付いていますね。これは、「NSError」というエラーに関するクラスのインスタンスです。エラーが発生すると、ここに用意した変数にNSErrorが保管されます。このため、一般的な変数をそのまま指定するのではなく、NSError変数のアドレスを渡します。

また、コピーや移動では、コピー・移動先のパスはディレクトリとファイル名の両方が指定できます。ディレクトリのパスを指定すると、そのディレクトリに同じファイル名でコピーや移動が行われます。が、ファイル名まできっちりと指定しておくと、そのファイル名で移動やコピーが出来ます。

ということは、ファイルのリネームもこれらで行える、ということになります。同じ場所に、別のファイル名でファイルを移動すれば、ファイルのリネームが行えるのです。これはテクニックとして覚えておくとよいでしょう。

下に、簡単な利用例をあげておきました。ホームディレクトリにあるdata.txtというファイルを、デスクトップにコピーするサンプルです。ファイルがなければエラーメッセージが表示されます。ここではファイルコピーを、以下のように行なっていますね。
[manager copyItemAtPath:path toPath:tpath error:&err];
これで、エラーが発生したらerr変数にNSErrorインスタンスが書き出されます。これがnilでなければエラーが起こった、というわけです。エラーが発生した場合は、
NSLog(@"%@.",[err localizedDescription]);
こんな形でエラーメッセージを出力しています。localizedDescriptionは、発生したエラーの内容をローカライズされたテキストとして返すメソッドです(といっても、ここでは英語でそのまま出力されるだけですが)。NSErrorについてはここでは深く取り上げませんが、まぁ「こうやってエラーの情報も取り出せるんだ」ぐらいは覚えておくといいでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSFileManager* manager = [NSFileManager 
                                  defaultManager];
        NSError* err = nil;
        NSString* path = [NSHomeDirectory() 
                          stringByAppendingPathComponent:
                          @"data.txt"];
        NSString* tpath = [NSHomeDirectory() 
                           stringByAppendingPathComponent:
                           @"Desktop/copyed.txt"];
        [manager copyItemAtPath:path toPath:
         tpath error:&err];
        if (err == nil) {
            NSLog(@"copyed.");
        } else {
            NSLog(@"%@.",[err localizedDescription]);
        }
    }
    return 0;
}
※関連コンテンツ

「初心者のためのObjective-Cプログラミング入門」に戻る