Я работаю над серверным программным обеспечением, которому периодически необходимо сохранять данные на диск. Мне нужно убедиться, что старый файл перезаписывается, и файл не может быть поврежден (например, только частично перезаписан) в случае непредвиденных обстоятельств.
Я принял следующий шаблон:
string tempFileName = Path.GetTempFileName();
// ...write out the data to temporary file...
MoveOrReplaceFile(tempFileName, fileName);
... где MoveOrReplaceFile:
public static void MoveOrReplaceFile( string source, string destination ) {
if (source == null) throw new ArgumentNullException("source");
if (destination == null) throw new ArgumentNullException("destination");
if (File.Exists(destination)) {
// File.Replace does not work across volumes
if (Path.GetPathRoot(Path.GetFullPath(source)) == Path.GetPathRoot(Path.GetFullPath(destination))) {
File.Replace(source, destination, null, true);
} else {
File.Copy(source, destination, true);
}
} else {
File.Move(source, destination);
}
}
Это работает хорошо, пока сервер имеет монопольный доступ к файлам. Однако File.Replace, похоже, очень чувствителен к внешнему доступу к файлам. Каждый раз, когда мое программное обеспечение запускается в системе с антивирусом или системой резервного копирования в реальном времени, случайный файл Начинают появляться ошибки .Replace:
System.IO.IOException: невозможно удалить файл, который нужно заменить.
Вот несколько возможных причин, которые я устранил:
И вот несколько предложений, с которыми я столкнулся, и почему я бы предпочел их не использовать:
Я был бы признателен за любой вклад, чтобы заставить File.Replace работать каждый раз или, в более общем плане, надежно сохранять / перезаписывать файлы на диск.