Feedback

VB - Freien Laufwerk-Speicherplatz überschreiben

Veröffentlicht von am 8/5/2007
(3 Bewertungen)
Mit einem kleinen Trick kann man den freien Speicherplatz auf einem NTFS-Volume
löschen bzw. überschreiben. Es werden permanet Daten in eine temp. Datei
geschrieben bis kein Speicherplatz mehr zur Verfügung steht. Anschließend wird diese Datei wieder gelöscht.
Imports System.IO

Private Sub ClearUnusedVolumeSpace(ByVal driveletter As String)
   ' Standard-Clustergrösse 4 KB 
   Dim Data(4095) As Byte
   Dim Stream As FileStream
   Dim TempFile As String = driveletter.Substring(0, 1) & ":\" & "FreeSpace.tmp"

   Try
      ' Temp. Datei erstellen
      Stream = New FileStream(TempFile, FileMode.Create, FileAccess.Write, FileShare.None)
      ' Enllosschleife, wird nur verlassen wenn kein Speicherplatz
      ' mehr zur Verfügung steht.
      Do
         Stream.Write(Data, 0, 4096)
      Loop
   Catch
      '
   Finally
      If Not Stream Is Nothing Then
         Stream.Close()
         ' Temp. Datei löschen - Fertig
         File.Delete(TempFile)
      End If
   End Try

End Sub

Abgelegt unter Laufwerk, Volume, NTFS.

7 Kommentare zum Snippet

Tim Hartwig schrieb am 8/5/2007:
Äußerst ineffizienter Code, du willst in einer Schleife den Restspeicherplatz der HDD mit leeren Daten füllen die dann auch noch eine Blockgröße von mickrigen 4 KB haben. Dann verlässt du die DO Schleife mit der annahme das wenn nicht mehr geschrieben werden kann ein Fehler ausgelöst wird und somit die Schleife abgebrochen wird. Ich hab schon viel Schrott gesehn aber das übertrifft alles. Und wenn du es doch machen willst dann reicht der Code hier (geht vor allem deutlich schneller, nämlich sofort):

Dim FS As New IO.FileStream("C:\Temp.dat", IO.FileMode.CreateNew)
FS.SetLength(Restspeicherplatz)
FS.Close()
Volker Steitz schrieb am 8/5/2007:
Da muss ich khartak recht geben. Der Tipp fällt noch dazu in die rubrik "Wie mache ich aus einem schnellen System ein langsames".

Viele Anwendungen benötigen "continous diskspace" also zusammenhängenden Speicher. der Tipp würde dazu führen, dass genau das Gegenteil eintritt.
Hardt schrieb am 8/6/2007:
Sicherlich habe ich grundsätzlich nichts gegen sachliche Kritik.
Aber sieht so Kritik aus ????
Wenn man etwas so böswillig kritisiert, dann sollte man zumindest auch den
"besseren Weg zum Ziel" darstellen. Dieses Verhalten kann ich bei "Khartak" nicht erkennen.
Meine vorgestellte Methode soll j e d e n freien Sektor/Cluster mit Daten überschreiben !
Dieses Ziel sollte mit den vorhandenen NET-Bordmitteln gelöst werden. Dabei ging es
mir nicht darum "hochoptimierten" Code zu erstellen.

Der Code von "Khartak", der aus drei Zeilen besteht, bewirkt absolut überhaupt nichts !!!!!!!!!!!!!!!!
Es wird nur eine Datei mit max. Grösse erstellt. Dabei wird nicht ein einziges Byte in diese Datei geschrieben sondern es werden n u r die Cluster vom BS als belegt gekennzeichnet.

Da kann ich selber "Khartak" nur zitieren - "Der 3-Zeiler-Schrott übertrifft alles, was ich bisher
gesehen habe."
Tim Hartwig schrieb am 8/6/2007:
In deinem Byte Array liegen aber auch keine Daten drin sondern nur 0-Werte. Das bewirkt das selbe wie meine Funktion. Es erstellt eine große Datei komplett aus Nullen bestehend. Wo ist da der Unterschied?
Tim Hartwig schrieb am 8/6/2007:
Noch was, wenn dann überschreibt man den freien Speicherplatz mit Zufallsdaten und nicht mit 0-Werten denn das bringt nicht viel.
Hardt schrieb am 8/6/2007:
Hallo "Khartak",

es ist scheinbar ein echtes Problem für Dich eine falsche Behauptung zu korrigieren. Leider bedauerlich, aber wohl auch nicht zu ändern.

Hier die Original-Microsoft Dokumentation zur FileStream.SetLength-Methode :
Wenn der Stream erweitert wird, ist der I n h a l t des Streams zwischen der alten und der neuen Länge u n d e f i n i e r t. (Dein Code ist somit absolut unbrauchbar.)

Der Microsoft Dokumentation ist eigentlich nichts mehr hinzuzufügen.

Happy Coding !!!
Tim Hartwig schrieb am 8/6/2007:
Naja ich will mich nicht weiter streiten. Ich seh das nunmal so das der Stream ein Stream ist und wenn er auf die Festplatte geschrieben wird bewirkt das das selbe wie dein Code. Wenn der Stream abgeschlossen ist, haben wir beide eine Datei mit lauter 0-Werten. Dein Code und mein Code bewirken im Endeffekt das selbe. Und sorry das ich dich so blöd angemacht bzw. kritisiert habe. Ich nehms zurück.
 

Logge dich ein, um hier zu kommentieren!