Есть ли альтернатива «усечению», которая звучит безопаснее? - PullRequest
2 голосов
/ 25 февраля 2012

У меня есть приложение, которое читает связанный список 1 из файла при его запуске и записывает его обратно в файл при его завершении. Я выбираю truncate в качестве режима файла при обратной записи. Тем не менее, truncate звучит немного опасно для меня, так как сначала очищает весь контент. Таким образом, если что-то пойдет не так, я не смогу вернуть свои старые вещи. Есть ли лучшая альтернатива?

1: я использую связанный список, потому что порядок элементов может измениться. Поэтому позже я использую truncate для обновления всего файла.


репутация правильного ответа достается Гансу, как он впервые указал File.Replace(), хотя пока он недоступен для Silverlight.

Ответы [ 4 ]

5 голосов
/ 25 февраля 2012

Запись в новый временный файл.Когда вы закончите и будете удовлетворены результатом, удалите старый файл и переименуйте / скопируйте новый временный файл в папку исходного файла.Таким образом, если что-то пойдет не так, вы не потеряете данные.

Как указано в ответе Ханса Пассанта, вы должны использовать File.Replace для максимальной надежности при замене исходного файла.

3 голосов
/ 25 февраля 2012

Это хорошо отражено в .NET Framework.Используйте метод File.Replace () .Он надежно заменяет содержимое вашего исходного файла содержимым другого файла, оставляя оригинал в такте, если есть какие-либо проблемы с файловой системой.Это лучшая ловушка для мыши, чем для ответов с голосованием, они потерпят неудачу при ожидающем удалении исходного файла.

Существует перегрузка, которая позволяет вам контролировать, сохраняется ли исходный файл как резервный файл.Лучше всего, если вы позволите функции создать резервную копию, это значительно увеличит шансы на успех функции, когда другой процесс заблокирует ваш файл, наиболее типичный режим сбоя.Они получат возможность сохранить файл резервной копии.Этот метод также работает лучше всего, когда вы создаете промежуточный файл на том же диске, что и исходный, поэтому вам следует избегать GetTempFileName ().Хороший способ создания имени файла - Guid.NewGuid (). ToString ().

2 голосов
/ 25 февраля 2012

Вы решили использовать truncate, поэтому я предполагаю, что ваши входные данные всегда заново, поэтому ....

  1. попробуйте ... поймать, чтобы переименовать исходный файл в нечто вроде 'originalname_day_month_year.bak'
  2. Напишите ex-novo ваш файл с новыми данными.

Таким образом, вам не нужно беспокоиться о потере чего-либо, и, как побочный эффект, у вас есть резервная копия ваших предыдущих данных. Если эта резервная копия не нужна, вы всегда можете удалить файл резервной копии.

2 голосов
/ 25 февраля 2012

«Лучшей» альтернативой надежности будет следующее:

  1. Создать новый файл для данных, которые вы сохраняете на диск
  2. Запишите данные в новый файл
  3. Выполните все необходимые проверки данных
  4. Удалите исходный файл
  5. Переместите новый файл в исходный файлlocation

Вы можете использовать System.IO.Path.GetTempFileName, чтобы предоставить вам временный файл с уникальным именем для использования на шаге 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...