File.Copy висит на поврежденном файле - PullRequest
3 голосов
/ 16 января 2011

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

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

Ответы [ 4 ]

4 голосов
/ 16 января 2011

Это может произойти, когда HD сильно поврежден, и HD реагирует очень долго.Обычно, когда у вас возникает ошибка CRC, это происходит в больших файлах с большим количеством секторов.

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

Однако существуют программы, разработанные для того, чтобы делать именно то, что вам нужно, и их проще использовать (просто поищите в Google информацию для восстановления данных).У некоторых будут специальные функции, которые с большей вероятностью восстановят ваши данные.Некоторые из них достаточно продвинуты со специальными алгоритмами и тому подобное.

1 голос
/ 16 января 2011

Я полагаю, вы используете методы копирования в стандартных классах System.IO (Directory / DirectoryInfo / File / FileInfo)?

Вы пытались копировать файлы с помощью FileStream?Чтобы предотвратить эти ошибки, вы можете установить ReadTimeout в потоке (stream.ReadTimeout).Таким образом, вы получаете исключения, когда операция чтения () занимает слишком много времени.И вы также должны получить ошибки, если файл не может быть открыт.

0 голосов
/ 26 февраля 2013

Я думаю, что CBD (Copy Bad Disk) - это именно то, что вам нужно: копировать файлы на поврежденные сектора без зависания или остановки, регистрировать положение нечитаемых байтов и т. Д.

0 голосов
/ 16 января 2011

Вам следует обратить внимание на инструмент восстановления данных, а не на некоторые советы, чтобы получить надежный процесс копирования в C # ...

Если ваш старый диск не сломан (из-за шума цепляется), тогда вам следуетпопробуйте восстановить файловую систему с помощью chkdsk .

. Если есть проблемы, которые chkdsk не может обработать, вам нужен инструмент для восстановления данных, например ddrescue или любой другой (попробуйтеGoogle 'восстановление данных' или 'копирование файлов с поврежденного диска').

...