38

最後にデータを追加しようとしているログ ファイルがあります。NSMutableString textToWrite変数があり、次のことを行っています。

[textToWrite writeToFile:filepath atomically:YES 
                                    encoding: NSUnicodeStringEncoding error:&err];

ただし、これを行うと、ファイル内のすべてのテキストが textToWrite のテキストに置き換えられます。代わりにファイルの末尾に追加するにはどうすればよいですか? (または、ファイルの末尾に新しい行を追加するにはどうすればよいですか?)

4

3 に答える 3

65

いくつかのことができると思います:

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];

これにより、ファイルに NSData が追加されることに注意してください。NSString ではありません。NSFileHandle を使用する場合は、事前にファイルが存在することを確認する必要があることに注意してください。fileHandleForWritingAtPathパスにファイルが存在しない場合は nil を返します。NSFileHandle クラス リファレンスを参照してください。

または、次のようにすることもできます。

NSString *contents = [NSString stringWithContentsOfFile:filepath];
contents = [contents stringByAppendingString:textToWrite];
[contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err];

2 番目のアプローチでは、新しいコンテンツをファイルに書き込む前に、ファイルのコンテンツを NSString に読み込む必要があるため、最初のアプローチが最も効率的だと思います。ただし、ファイルに NSData を含めずにテキストのままにしたい場合は、2 番目のオプションの方が適しています。

[更新] stringWithContentsOfFile は非推奨であるため、2 番目のアプローチを変更できます。

NSError* error = nil;
NSString* contents = [NSString stringWithContentsOfFile:filepath
                                               encoding:NSUTF8StringEncoding
                                                  error:&error];
if(error) { // If error object was instantiated, handle it.
    NSLog(@"ERROR while loading from file: %@", error);
    // …
}
[contents writeToFile:filepath atomically:YES
                                 encoding:NSUnicodeStringEncoding
                                    error:&err];

スタックオーバーフローに関する質問を参照してください

于 2012-06-19T18:02:33.830 に答える