1

既存のファイルがあり、その内容を削除してから再度書き込みたいのですが、1行ずつ追加するだけです。これが私のコードで、なぜそれが機能しないのかわかりません:

if ([filemgr removeItemAtPath: fileName error: NULL]  == YES){
        NSLog (@"Remove successful");
    }
    else{
        NSLog (@"Remove failed");
    }

    NSString *cachePath = [[NSString alloc] initWithFormat:@"%@",fileName];
    NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:cachePath];
    BOOL isFirst = NO;

    for(id entry in serializedObjects){
        NSString *sectionName = [NSString stringWithFormat:@"!%@\n", entry];
        [fileHandler writeData:[sectionName dataUsingEncoding:NSUTF8StringEncoding]];

        if (!isFirst) {
            [fileHandler seekToEndOfFile];
            isFirst = YES;
        }

        NSArray *list = [serializedObjects objectForKey:entry];

        for (int i = 0; i < list.count; i++) {
            NSString *line = [[list objectAtIndex:i] stringByAppendingString:@"\n"];
            [fileHandler writeData:[line dataUsingEncoding:NSUTF8StringEncoding]];
        }

        [fileHandler writeData:[[NSString stringWithFormat:@"%@", @"~\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    }

[fileHandler closeFile];

私のアイデアは、ファイルに最初の行を書き込み、他の行を追加することでした。私がここで間違っていることを誰かが見ていますか?

このメソッドが完了した後、エラーは表示されませんが、手動で確認した後、書き込もうとしているファイルは存在しません。

4

1 に答える 1

0

ファイルハンドルは、すぐにディスクに書き込まない I/O バッファに書き込みます。io は遅いため、これはファイル ハンドル オブジェクトに組み込まれた効率です。ディスクに確実に書き込むには、synchronizeFile を使用して io バッファーをフラッシュする必要があります。また、ファイル ハンドルの処理が完了したら、closeFile を呼び出す必要があります (これも同期されるため、同期はオプションです)。

于 2012-05-10T14:43:53.347 に答える