2011-01-16 4 views
3

J'ai essayé de copier des fichiers d'un ancien disque vers un nouveau disque. Le problème est, l'ancien disque a (je peux seulement supposer) des endroits corrompus sur le disque, et toute tentative de lecture de certains de ces fichiers se traduit par ce qui semble être une sorte de boucle sans fin. Il y a pas mal de fichiers problématiques éparpillés dans les fichiers que je veux copier, et quand il touche le premier, mon application reste là à ne rien faire jusqu'à ce que je l'arrête. J'espérais pouvoir contourner ce problème en écrivant un programme personnalisé pour recopier les répertoires, copier les fichiers un par un, et détecter les erreurs qui apparaîtraient sur les opérations de copie individuelles, mais cela n'amènerait jamais une erreur ... -Juste assis là et s'assoit là et s'assoit là. La seule façon d'arrêter cela est d'éteindre physiquement le disque dur problème - ne peut pas arrêter le programme en essayant de mettre fin au processus ou quelque chose comme ça.File.Copy se bloque sur le fichier corrompu

Je suis un peu perplexe quant à la façon de procéder. Étant donné que ce genre d'erreur va se produire, est-il possible d'automatiser ce processus? Est-ce que quelqu'un a de l'expérience avec ça?

+0

Il s'agit d'un problème en mode noyau. Je ne pense pas que vous puissiez y faire quelque chose. – SLaks

Répondre

1

Je suppose que vous utilisez les méthodes de copie sur les classes System.IO standard (Directory/DirectoryInfo/File/FileInfo)?

Avez-vous essayé de copier les fichiers avec un FileStream? Pour éviter ces erreurs, vous pouvez définir le ReadTimeout sur le flux (stream.ReadTimeout). De cette façon, vous obtenez des exceptions lorsque l'opération Read() prend trop de temps. Et vous devriez également obtenir des erreurs si un fichier ne peut pas être ouvert.

+0

Une petite recherche indique que vous ne pouvez utiliser cette propriété qu'avec des lectures réseau, et non avec des lectures de systèmes de fichiers locaux. Je reçois une erreur "Timeout non pris en charge sur ce flux" lorsque j'essaye de vous suivre, et tout échoue. Bonne idée cependant. – SuperNES

+0

Désolé, vous avez raison. Que diriez-vous: Dérivez de FileStream; implémenter le ReadTimeout et remplacer Read (..) qu'il jette des exceptions quand cela prend trop de temps? – CaptainPlanet

4

Cela peut se produire lorsque la HD est extrêmement corrompue et que le HD met très longtemps à réagir. Habituellement quand vous êtes une erreur CRC est quand cela se produit et sur de gros fichiers avec beaucoup de secteurs vissés.

Vous devriez regarder en utilisant des méthodes de visualisation de secteurs de niveau inférieur, alors vous aurez plus de contrôle quand arrêter.

Il existe des programmes qui sont conçus pour faire exactement ce que vous voulez qui pourrait être plus facile à utiliser (il suffit de rechercher google pour la récupération de données). Certains vont avoir des fonctionnalités spéciales qui sont plus susceptibles de récupérer vos données. Certains sont assez avancés avec des algorithmes spéciaux et autres.

0

Vous devez rechercher un outil de récupération de données et non pour certains Tipps pour obtenir un processus de copie robuste en C# ...

Si votre ancien disque est concassées (marques accrochaient bruits accrochais), alors vous devriez essayer pour récupérer le système de fichiers avec chkdsk. En cas de problèmes que chkdsk ne peut gérer, vous avez besoin d'un outil de récupération de données tel que ddrescue ou autre (essayez la récupération de données de Google ou copiez des fichiers depuis un disque corrompu).

+0

C'est un programme Unix? Je suis sur Windows. – SuperNES

+0

avez-vous essayé chkdsk en premier? C'est l'outil intégré dans Windows pour corriger le système de fichiers. – Matten

0

Je pense que CBD (Copy Bad Disk) est exactement ce dont vous avez besoin: copier des fichiers sur des secteurs défectueux sans blocage ou arrêt, position de journal des octets illisibles, etc.