iPhone 開発 cocoa ファイルの入出力

NSData型をファイルに入出力する時は、NSStringとほぼ同様に、

[anyNsData writeToFile:file_path atomically:YES];
NSData *data = [NSData dataWithContentsOfFile:file_path options:NSMappedRead error:&error];

このようにして行えます。


別のやり方もあります。
ファイルの読み込みは、

NSMutableArray* hogeTable;
NSString* filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/data.bin"];
NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath:filePath];
if(file){
    NSData* data = [file readDataToEndOfFile];
    [file closeFile];
    hogeTable = [[NSKeyedUnarchiver unarchiveObjectWithData:data] retain];
}


ファイルの書き込みは、

NSString* homeDir = NSHomeDirectory();
NSString* docDir = [homeDir stringByAppendingPathComponent:@"Documents"];
NSFileManager* mng = [NSFileManager defaultManager];
[mng changeCurrentDirectoryPath:docDir];
NSFileHandle* fileHn = [NSFileHandle fileHandleForWritingAtPath:@"data.bin"];
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:hogeTable];
[fileHn writeData:data];

このようになります。
ただし、ファイルの書き込みは、上書きしかできません。
ファイルが存在していない時は例外が発生します。


新規にファイルに書き込みたい時は、以下のようにします。

NSString* homeDir = NSHomeDirectory();
NSString* docDir = [homeDir stringByAppendingPathComponent:@"Documents"];
NSString* filePath = [docDir stringByAppendingPathComponent:@"data.bin"];
NSFileManager* mng = [NSFileManager defaultManager];
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:hogeTable];
[mng createFileAtPath:filePath contents:data attributes:nil];

なお、上書きの時もこのmng:createFileAtPath:が使えます。
つまりファイル全体を一度に書き込む場合は、
NSFileHandleを使う必要はまったくありません。
このやり方は、数回に分けてファイルにアクセス
する場合に限るでしょう。


ファイルが存在するかどうかは、

NSString* filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/data.bin"];
NSFileManager* mng = [NSFileManager defaultManager];
Bool flag;
if([mng fileExistsAtPath:filePath isDirectory:&flag] == YES ){
    // ファイルが存在する時の処理
} else {
    // 新規作成処理
}

このようにチェックできます。


↓こちらを参考にしました。
http://d.hatena.ne.jp/It_lives_vainly/20090311/1236745568