2015-07-01 2 views
0

У меня есть файл, который я копирую в какое-то место. Ниже приведен фрагмент кода -Убедитесь, что файл успешно скопирован

//Document Status = Pending 
var triggerFileWriter = new StringWriter(); 
triggerFileWriter.WriteLine("Only for test"); 
System.IO.File.WriteAllText(fullTriggerFilename, triggerFileWriter.ToString()); 
triggerFileWriter.Dispose(); 

if (System.IO.File.Exists(fullTriggerFilename)) 
{ 
    // Document Status = Processed 
} 

ли File.Exists проверка достаточно, чтобы обновить статус документа?
Я не беспокоюсь, если файл не скопирован и статус документа не обновлен. Поскольку работа с таймером выполняется каждые 10 минут, элементы «Ожидание» будут автоматически отобраны в следующем прогоне.

Есть ли возможность прерывания копирования файлов - что может привести к файлу, но не полностью скопировано? Какие изменения я могу внести в свой код, если это произойдет.

Спасибо!

+0

Существует * кэш записи *, поэтому вам необходимо [flush] (http://stackoverflow.com/q/383324/1997232), чтобы обеспечить его безопасность. Кроме того, что вы не получаете исключений во время 'WriteAllText', конечно. – Sinatr

+0

@Sinatr 'Flush' не ждет, пока жесткий диск физически сохранит данные (больше). В современных системах просто нет способа убедиться, если у вас нет возможности проверить целостность файла - или полагаться на файловые системы, которые позволяют создавать атомарные файлы (например, NTFS). Что еще более важно, это не решает проблему OP - ему не нужно гарантировать, что файл правильно написан, ему просто нужно знать, должен ли файл, который он сейчас обрабатывает, обрабатывать или не нужно обрабатывать. – Luaan

+0

@ Luaan, вы проверили связанный вопрос в моем комментарии? – Sinatr

ответ

1

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

В NTFS файлы, которые не были должным образом «зафиксированы», в основном удалены, поэтому File.Exists в порядке. Это может быть не так, например, при использовании, например, FAT-32 или при сохранении сетевой файловой системы.

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

+0

Спасибо за ваш ответ. Фактически файл копируется через сетевую файловую систему - на другой сервер. Могу ли я полагаться на File.Exists? – iniki

+0

@iniki Это зависит от того, есть ли у вас контроль над удаленной стороной. Если это сервер Windows с NTFS, вы должны быть в безопасности. – Luaan

0

Вы можете использовать хеш-функцию, такую ​​как SHA или MD5 на оригинальном файле и сохранить его. Затем примените одну и ту же функцию хэша в скопированном файле и сравните два хэша. Они должны быть одинаковыми.

0

Вы вызываете метод File.WriteAllText. Это означает, что ваша работа будет выполнена или вы получите исключение. Таким образом, у вас есть гарантия, предоставленная .NET I/O API, что файл был правильно написан.

Но у вас никогда не будет гарантии, что он существует в каком-то ресурсе. Поэтому вам не нужно звонить File.Exists. Просто не полагайтесь на это. Все может случиться.

Смежные вопросы