File.Copy возвращает void, так как же определить, была ли операция успешной?

Я использую следующий код для копирования удаленного файла в локальный. Как обнаружить сбой в операции при копировании больших файлов.

Есть ли лучший подход для обнаружения сбоя, кроме обработки исключения system.io?

File.Copy(remoteSrcFile, dest);

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


person Abhijeet    schedule 18.09.2012    source источник


Ответы (2)


Есть ли лучший подход для обнаружения сбоя, кроме обработки исключения system.io?

Многие возможные ошибки, такие как неверное имя файла, можно проверить заранее. Если File.Copy завершается ошибкой, сгенерировать исключение. Другого индикатора ошибки нет.

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

Это зависит от того, какие другие функции вы хотите. Например, если вы хотите показать прогресс, File.Copy вам не поможет, так как он просто оборачивает API FileCopy. Однако вызов Windows API FileCopyEx может обеспечить прогресс. См. раздел Могу ли я показать ход копирования файла с помощью FileInfo. CopyTo() в .NET? для получения дополнительной информации.

person akton    schedule 18.09.2012
comment
Предварительная проверка на сбой может быть полезной; но это не избавляет от необходимости перехватывать возникающие из них исключения. Если разрешения изменяются в промежутке между моментом проверки и сбоем File.Copy, все приложение закрывается, что явно нехорошо. - person Peter Ritchie; 19.09.2012
comment
@PeterRitchie Есть небольшое окно, в котором это может произойти, да. Лучшим примером может быть недопустимое имя файла. - person akton; 19.09.2012
comment
Конечно, но такие обстоятельства бывают редко. Может быть, просто неверное имя файла или длина пути (не уверен, что они выходят как одно и то же исключение)... - person Peter Ritchie; 19.09.2012
comment
@PeterRitchie Я обновил ответ, чтобы исключить более сомнительные случаи. - person akton; 19.09.2012

Предполагается, что сбои копирования являются исключительным обстоятельством, поэтому сбои моделируются как исключения.

Вы должны обернуть вызовы File.Copy в try/catch, чтобы перехватывать любые исключения, которые вы можете явно учесть.

File.Copy — единственное, что «включено» в фреймворк вместе с FileInfo.CopyTo. Но вы можете использовать его по-разному. Может быть, создать поток, чтобы вызвать его. Вы также можете использовать базовый ввод-вывод для чтения данных из одного файла в другой, чтобы улучшить прогресс/отмену; но это зависит от того, чего вы хотите достичь.

person Peter Ritchie    schedule 18.09.2012