Небольшое отклонение от решения Марка Байера, которое я использую постоянно:
- Записать новое содержимое во временный файл в том же каталоге, как файл, который вы хотите заменить.
- Если запись прошла успешно, переименуйте [1] в нужный файл.
Переименование является атомарным, поэтому в случае успеха система не остается в неопределенном состоянии. Если происходит сбой, то, опять же, система все еще находится в первоначальном состоянии И , у вас есть резервная копия содержимого, которое вы хотели заменить (во временном файле) при перезагрузке системы.
Мое типичное соглашение об именах выглядит следующим образом:
/ путь / к / оригинал / content.data
/ путь / к / оригинальный /.# content.data
Если система выключается где-то в этом процессе, при перезапуске вашего приложения вы можете выполнить сканирование. # Content.data и либо представить его пользователю как то, что он вводил при выходе из системы, либо использовать какой-либо пользовательский Волшебство, чтобы решить, является ли это "полным", чтобы решить, стоит ли переименовать его через content.data.
Я не знаю, какие данные вы пишете, поэтому я не могу помочь вам решить, какой будет эта «магия», но если, например, это xml-файл, вы можете проанализировать его на предмет корректности, и если вы не получите неожиданный конец файла, тогда, возможно, у вас есть полный файл.
FWIW, ограничение себя записью 8k не спасет вас, потому что вы теперь зависите от деталей реализации в базовой ОС и FS, которые могут измениться в следующей версии или отличаться в предыдущей версии.
Ссылки:
- http://83.139.107.116:8080/1.1/handlers/monodoc.ashx?link=M%3aMono.Unix.Native.Stdlib.rename(System.String%2cSystem.String)