Повреждение файла iPhone - PullRequest
       20

Повреждение файла iPhone

1 голос
/ 21 марта 2010

Возможно ли (на iPhone / iPod Touch) файл, написанный следующим образом:


if (FILE* file = fopen(filename, "wb")) {
    fwrite(buf, buf_size, 1, file);
    fclose(file);
}

чтобы испортиться, например когда приложение вынуждено завершить работу?

Из того, что я знаю, fwrite должна быть атомарной операцией, поэтому, когда я пишу весь файл одной инструкцией, не должно происходить искажения. Я не смог найти в сети никакой информации, которая бы говорила иначе.

Ответы [ 3 ]

1 голос
/ 21 марта 2010

Данные, записанные с fwrite, буферизуются. Таким образом, внезапное завершение может не очистить буферы. fclose очистит буфер, но это не означает, что байты также записываются на диск (из-за кэшей на уровне ОС) AFAIK.

1 голос
/ 21 марта 2010

С каких пор fwrite является атомным? Я не могу найти никаких ссылок. В любом случае, даже если fwrite может быть атомарным, время между fopen и fwrite равно , а не , поэтому, если ваше приложение вынуждено завершить работу между этими временами, вы получите пустой файл.

Когда вы пишете для iPhoneOS, вы можете использовать -[NSData writeToFile:atomically:], чтобы убедиться, что вся процедура открытия-записи-закрытия является атомарной (она работает, записывая во временный файл, а затем заменяет оригинальный).

1 голос
/ 21 марта 2010

Вы можете упростить для себя задачу и записать данные, используя класс NSData , в котором вас ждет метод writeToFile:atomically:. Завершение необработанного буфера с помощью NSData не сложно, есть инициализаторы dataWithBytes:length или dataWithBytesNoCopy:length:freeWhenDone:.

...