Frage

Ich möchte eine Datei zum Schreiben bringen, um eine Datei vollständig zu löschen, indem ich Nullen in ihre physischen Bereiche schreibe.

Dateien können auf Festplatten in Stücken gespeichert werden, nicht immer in einem ganzen Block.

Wenn ich physische Bereiche sage. Ich meine die physischen Abschnitte, dass die Datei gespeichert wird, oder auf die Verweise auf die Abschnitte, die ich "Schreibkern" ausführen kann.

Besser in C#.

War es hilfreich?

Lösung

Leider ist dies in C# und in C/C ++ nicht möglich, selbst wenn Sie einen Kernel -Modus -Treiber schreiben.

Zitat aus dem Bleachbit -Dokumentation:

Durch die ordnungsgemäße Sendung einer einzelnen Datei geht davon aus, dass ihre Position vollständig bekannt sein kann, aber im Grunde ist sie nur in einem idealen Fall bekannt. Der ideale Fall hat drei Merkmale:

  1. Die Dateigröße ist wegen der Bearbeitung nie geschrumpft. Stellen Sie sich vor, Sie beginnen mit einer 3 -MB -Tabelle, bearbeiten Sie es auf 1 MB (unter Verwendung der Tabellenkalkulationsanwendung) und bitten Sie die sauberere Anwendung, die 1 -MB -Version zu löschen: Der Reiniger kann nicht wissen, wo die fehlende 2 MB auf der physischen Festplatte zugewiesen wurde. (Denken Sie daran: Dateisysteme speichern oft keine Dateien kontinuierlich, sodass Sie nicht davon ausgehen können, dass der fehlende Teil direkt nach dem bekannten Teil war.)
  2. Die Datei hat sich nie verschoben. Stellen Sie sich vor, die Tabellenkalkulationssoftware speichert das Dokument, indem Sie eine neue Kopie in eine temporäre Datei schreiben, die alte Kopie löschen und die temporäre Datei in den ursprünglichen Namen umbenennen. In diesem Fall kann die sauberere Anwendung nicht wissen, wo sich eine der alten Tabellenkalkulationen befand.
  3. Das Dateisystem überschreibt Dateien an derselben Stelle. Dies ist eine gute Annahme. Unter Windows NTFs und unter Linux überschreiben Sie die Dateien an derselben Stelle, aber die transparente Datenträgerkomprimierung, Verschlüsselung und Sparse -Dateien überschreiben die Dateien möglicherweise nicht überschreibt, die die häufigsten Ext3 -Konfiguration (die die häufigste Ext3 -Konfiguration (die bei Ubuntu 9.10 und anderen Linux -Verteilungen) überschreiben.

Weiter: Wenn ein Bereich einer modernen Festplatte beschädigt wird, wird der schlechte Sektor automatisch zu einem Ersatz verkleinert. Diese Vorgänge liegen im Ermessen der Firmware des Laufwerks und weder das Betriebssystem noch Anwendungen sind sich des Umzugs bewusst. Daher ignoriert das Wischen des Laufwerks den beschädigten Bereich.

Trotzdem ist es möglich (wenn auch nicht einfach), herauszufinden, welche Sektoren der Datei eine Datei fahren zur Zeit besetzt. Dies erfordert jedoch, dass Ihre Anwendung (zumindest teilweise) das verwendete Dateisystem versteht und wie das Dateisystem Dateien auf dem zugrunde liegenden Medium speichert.

Schließlich bleibt die Frage, welche zusätzliche Sicherheit Sie erhalten würden, indem Sie alle Sektoren, die Ihre Datei besetzt

using(var fs = new System.IO.FileStream(@"m:\delme.zip", 
                                        FileMode.Open,
                                        FileAccess.Write,
                                        FileShare.None))
{
    var zeros = new byte[fs.Length];

    fs.Write(zeros, 0, zeros.Length);       
}

Andere Tipps

Im Allgemeinen gibt es dafür keine .NET -API. Höchstwahrscheinlich möchten Sie das manuelle Lesen von FS-Strukturen von der Festplatte und analysieren und die Dateizuweisungsstrukturen analysieren und Interop verwenden, um zu einem Block-IO auf niedrigem Niveau zu gelangen.

Vielleicht möchten Sie versuchen, Nullen in die Datei zu schreiben, ohne die Länge zu ändern und zu beobachten, was passiert. Die Chancen stehen gut, dass die Datei nicht neu zugewiesen wird. Ich weiß wirklich nicht, ob das der Fall ist, und ich vermute, dass es von der Betriebssystem, der Betriebssystemversion, der FS abhängt und sich möglicherweise sogar zwischen SSDs und HDDs unterscheidet.

Betrachten Sie auch den Fall, wenn die Datei, die Sie zu zerkleinern versuchen, kürzlich vom Betriebssystem neu zugeordnet wurde. Einige der von der Datei verwendeten Bereiche sind jetzt als "leer" gekennzeichnet, aber die Daten sind immer noch da. Es gibt (fast) keine Möglichkeit herauszufinden, was diese Bereiche sind/waren, ohne die gesamte Festplatte tatsächlich zu "zerkleinern".

Für paranoide unter uns: Das Schreiben von Nullen (oder einem oder Müll) in die Dateibereiche garantiert nicht, dass die alten Daten nicht wiederherstellbar werden. Das physische Zerstören des Antriebs könnte den Trick machen, aber dafür gibt es keine API;)

Ich bin mir nicht sicher, ob Sie das tun können. Entsprechend Dies, Sie können dazu nur nicht verwalteten Code verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top