2011-01-16 6 views
3

Ich habe versucht, Dateien von einem alten Laufwerk auf ein neues Laufwerk zu kopieren. Problem ist, das alte Laufwerk hat (ich kann nur annehmen) einige beschädigte Stellen auf der Festplatte, und jeder Versuch, von einigen dieser Dateien zu lesen, führt zu einer Art Endlosschleife. Es gibt ziemlich viele Problemdateien, die über die Dateien verteilt sind, die ich kopieren möchte, und wenn es die erste trifft, sitzt meine Anwendung einfach da und macht nichts, bis ich sie aufhalte. Ich hatte gehofft, ich könnte das umgehen, indem ich ein benutzerdefiniertes Programm schreibe, um die Verzeichnisse durchzuspielen, die Dateien einzeln zu kopieren und alle Fehler zu erkennen, die bei einzelnen Kopiervorgängen auftauchen, aber es kommt nie zu einem Fehler. - sitzt nur da und sitzt dort und sitzt dort. Der einzige Weg, dies zu stoppen, ist, die Problemfestplatte physisch auszuschalten - kann das Programm nicht stoppen, indem es versucht, den Prozess oder etwas Ähnliches zu beenden.File.Copy hängt an beschädigter Datei

Ich bin etwas verwirrt, wie Sie vorgehen. Ist diese Art von Fehler gegeben, gibt es eine Möglichkeit, diesen Prozess zu automatisieren? Hat jemand damit Erfahrung?

+0

Dies ist ein Kernel-Modus-Problem. Ich glaube nicht, dass Sie irgendetwas dagegen tun können. – SLaks

Antwort

1

Ich vermute, Sie verwenden die Kopiermethoden auf den Standard-System.IO-Klassen (Directory/DirectoryInfo/File/FileInfo)?

Haben Sie versucht, die Dateien mit einem FileStream zu kopieren? Um diese Fehler zu vermeiden, können Sie das ReadTimeout im Stream (stream.ReadTimeout) setzen. Auf diese Weise erhalten Sie Ausnahmen, wenn die Operation Read() zu lange dauert. Und Sie sollten auch Fehler bekommen, wenn eine Datei nicht geöffnet werden kann.

+0

Ein wenig googeln besagt, dass Sie diese Eigenschaft nur mit Netzwerk-Leseoperationen verwenden können, nicht mit lokalen Dateisystem-Lesevorgängen. Ich erhalte den Fehler "Zeitüberschreitung bei diesem Stream nicht unterstützt", wenn ich es versuche und alles fehlschlägt. Gute Idee. – SuperNES

+0

Entschuldigung, Sie haben Recht. Wie wäre es: Ableiten von FileStream; Implementiere das ReadTimeout und überschreibe Read (..), dass Exceptions ausgelöst werden, wenn es zu lange dauert? – CaptainPlanet

4

Dies kann passieren, wenn die HD extrem korrupt ist und es sehr lange dauert, bis die HD reagiert. Normalerweise, wenn Sie einen CRC-Fehler haben, ist dies der Fall und auf große Dateien mit vielen Sektoren geschraubt.

Sie sollten in die Verwendung von Methoden der unteren Ebene der Anzeige von Sektoren schauen, dann haben Sie mehr Kontrolle wann zu stoppen.

Es gibt Programme, die entwickelt wurden, um genau das zu tun, was Sie wollen, die einfacher zu verwenden sind (suchen Sie einfach Google für Datenwiederherstellung). Einige werden spezielle Funktionen haben, die Ihre Daten eher wiederherstellen. Einige sind ziemlich fortgeschritten mit speziellen Algorithmen und so weiter.

0

Sie sollten für ein Datenrettungs-Tool suchen und nicht für einige tipps einen robusten Kopiervorgang in C# bekommen ...

Wenn Ihr altes Laufwerk ist nicht gebrochen (Marken klammerten klammerte Geräusche), dann sollten Sie versuchen, Wiederherstellung des Dateisystems mit chkdsk.

Wenn es Probleme gibt, die chkdsk nicht verarbeiten kann, benötigen Sie ein Datenrettungswerkzeug wie ddrescue oder irgendein anderes (versuchen Sie Google "Datenwiederaufnahme" oder "kopieren Akten von der verdorbenen Diskette").

+0

Das ist ein Unix-Programm? Ich bin auf Windows. – SuperNES

+0

hast du chkdsk zuerst versucht? Es ist das Windows-Tool zur Korrektur des Dateisystems. – Matten

0

Ich denke, CBD (Copy Bad Disk) ist genau das, was Sie brauchen: Kopieren Sie Dateien auf fehlerhafte Sektoren ohne hängen oder zu stoppen, Protokollposition von nicht lesbaren Bytes, etc.