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