3

ios は、ファイルが書き込まれたと主張しますが、変更が実際に保存されることはありません。まるでバッファーに残っているかのようです。フラッシュする必要がありますか?

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *myFilePath = [[NSBundle mainBundle]
                            pathForResource:@"MyFile"
                            ofType:@"txt"];

    NSLog(@"\n\nPath = \n%@", myFilePath);

    NSString *myFileContents = [NSString stringWithContentsOfFile:myFilePath
                                    encoding:NSUTF8StringEncoding
                                    error:nil];


    NSLog(@"\n\nContents = \n%@", myFileContents);

    [@"This line will be written to file" writeToFile:myFilePath
        atomically:YES encoding:NSUTF8StringEncoding error:nil];

    NSString *changedContents = [NSString stringWithContentsOfFile:myFilePath
                                    encoding:NSUTF8StringEncoding
                                    error:nil];

    NSLog(@"\n\nChanged Contents = \n%@", changedContents);
}

出力:

Path = 
/Users/hamzeh/Library/Application Support/iPhone Simulator/5.1/Applications/2B318687-A745-4CD9-85BA-52A01AB76F6E/savepersistentdata_tutorial.app/MyFile.txt

Contents = 
This is a text file.
The file will be displayed on the iPhone.
That is all for now. 

Changed Contents = 
This line will be written to file

これは、実行するたびに得られる出力であるため、変更は実際にはファイルに書き込まれません。

助けてくれてありがとう。

4

3 に答える 3

7

メイン バンドル内のファイルを編集することはできません。最初にファイルをアプリケーション ドキュメント フォルダに保存してから、変更を加える必要があります。

問題を解決するためのコードを次に示します。

まず、作成したディレクトリにテキストを保存します。

NSString *myFilePath = [[NSBundle mainBundle]
                            pathForResource:@"MyFile"
                            ofType:@"txt"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *directory = [NSString stringWithFormat:@"%@/Some_Directory", [paths objectAtIndex:0]];

// Check if the directory already exists
if (![[NSFileManager defaultManager] fileExistsAtPath:directory]) {
    // Directory does not exist so create it
    [[NSFileManager defaultManager] createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:nil];
} 

NSData *data = [[NSData dataWithContentsOfFile:myFilePath] retain];

NSString *filePath = [[directory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", [myFilePath lastPathComponent]]] retain];



NSError *error = nil;
if (![data writeToFile:filePath options:NSDataWritingFileProtectionNone error:&error]) {
    [data writeToFile:filePath atomically:NO];
}
[data release];
[filePath release];
于 2012-05-20T05:48:52.270 に答える
0

リソース バンドルは読み取り専用であるため、メイン バンドルにファイルを書き込むことはできません。writeToFileメソッドのリターンも確認できます。デバイスにデプロイすると false が返されます。

于 2012-05-20T05:59:53.700 に答える
0

NOパラメータを使用

[@"This line will be written to file" writeToFile:myFilePath atomically:NO encoding:NSUTF8StringEncoding error:nil];

iOSドキュメントによると

(BOOL)useAuxiliaryFile
YES の場合、受信者は補助ファイルに書き込まれ、補助ファイルの名前が path に変更されます。NO の場合、レシーバーはパスに直接書き込まれます。YES オプションは、書き込み中にシステムがクラッシュしたとしても、パスが存在する場合でも破損しないことを保証します。

于 2012-05-20T05:34:30.823 に答える