iPhone 開発 cocoa テキストファイルの入出力

NSString型にはファイル出力する機能がある。
これを使うと簡単にテキストファイルの読み書きが出来る。


↓こちらを参考にしました。
http://wiki.onakasuita.org/pukiwiki/?Objective-C%2F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%A5%E5%87%BA%E5%8A%9B


読み込み:

NSString* text;
NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/text.txt"];
NSError* error;

text = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];


書き込み:

NSString* text = @"hogehoge";
NSError* error;
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if([paths count] > 0){
    NSString* dirPath = [paths objectAtIndex:0];
    NSString* path = [dirPath stringByAppendingPathComponent:@"text.txt"];
    //atomicallyは補助ファイルを使ってファイルの破損を防止するかどうか
    BOOL result = [text writeToFile:path atomically:yes encoding:NSUTF8StringEncoding error:&error];
}


ファイルのパスの作り方を読み込みと書き込みで違うやり方を示した。
pathsを使う書き込みの方が正式なやり方と言われている。

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