AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datei sicher löschen

Offene Frage von "oki"
Ein Thema von oki · begonnen am 9. Jun 2009 · letzter Beitrag vom 25. Jan 2010
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#11

Re: Datei sicher löschen

  Alt 9. Jun 2009, 18:36
wenn man genauer sucht, dann findet man bestimmt sogar meinen alten Shreder-Code hier irgendo, welcher auch nicht grad auf dem "aktuellen" Wissensstand ist

Zitat:
// zuerst umbennen, dann später keine Rückschlüsse auf den Dateinamen möglich sind
du weißt aber, daß NTFS sich dennoch den alten Namen merkt?

Bei meiner Datenplatte mit 16-KB-Clustern würde zu 50% was vom Slack-Space übrig bleigen,
bei meiner Systemplatte mit nur 4 KB würde zu 50% mehr, als nötig überschrieben und beim USB-Stick zu 93%, da nur 0,5 KB.


Zitat von oki:
@himitsu: das ist jetzt aber nicht fair Mich so ins Aus zu schicken. Wie ermittel ich die unalokierten Cluster?
ja wie nur ... bei FAT und NTFS könnte man sich das Volumebitmap laden,
und da drin nachsehn.
dann brauchst du noch direkten Schreibzugriff auf den Datenträger, was mindesten Adminrechte verlangt

aber solange du dich nicht mit dem Aufbau der Dateisysteme auskennst, weißt du dann immernoch nicht, welche Sektoren nun zu löschen sind

Zitat von oki:
Was ist, wenn ich Dateien mit geringerer Länge habe?
idealer Weise besorgst du dir die Clustergröße und rundest deine Dateigröße auf das nächste Vielfache davon auf ... ich glaub das konnte mein alter Code schon ... falls den wer findet
$2B or not $2B
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#12

Re: Datei sicher löschen

  Alt 9. Jun 2009, 18:44
Zitat von shmia:
Delphi-Quellcode:
const
  Fillchars: array[0..5] of char = (Char($00), Char($FF), Char($00), Char($F0), Char($0F), Char($00));
  BLOCK_SIZE = 8096;
var
   fs : TStream;
   buffer : String;
   i, j : Integer;
begin
   fs := TFileStream.Create(filename, fmOpenReadWrite or fmShareExclusive);
   try
      // Datei auf nächste Blockgrösse verlängern, damit der "Slack" überschrieben
      // wird
      fs.Size := ((fs.Size div BLOCK_SIZE) +2) * BLOCK_SIZE;
Sehr unschöne Lösung, vorallem weil Cluster durchaus größer als 8 KB sein können. Es wäre besser zur Laufzeit die Cluster Größe auf dem Laufwerk zu ermitteln, auf dem geschrieben werden soll: MSDN-Library durchsuchenGetDiskFreeSpace
Fridolin Walther
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Datei sicher löschen

  Alt 9. Jun 2009, 19:23
Zitat:
Zitat:
// zuerst umbennen, dann später keine Rückschlüsse auf den Dateinamen möglich sind

du weißt aber, daß NTFS sich dennoch den alten Namen merkt?
Nein wußte ich nicht und der Code kommt nicht von mir (Gott sei Dank).

Solange die Datei sicher gelöscht ist kann man zur Not damit leben. Sollte sich da noch ein Weg finden lasse, so währe es dann aber konsequent.

Zitat:
oki hat folgendes geschrieben:
@himitsu: das ist jetzt aber nicht fair Rolling Eyes Mich so ins Aus zu schicken. Wie ermittel ich die unalokierten Cluster?


ja wie nur ... bei FAT und NTFS könnte man sich das Volumebitmap laden,
und da drin nachsehn.
dann brauchst du noch direkten Schreibzugriff auf den Datenträger, was mindesten Adminrechte verlangt

aber solange du dich nicht mit dem Aufbau der Dateisysteme auskennst, weißt du dann immernoch nicht, welche Sektoren nun zu löschen sind
Die Dateien, die bei mir zu löschen sind werden nur für die aktuelle Sitzung auf den Datenträger kopiert und sollen bei Beenden des Programms sicher gelöscht werden. Somit gehe ich davon aus, dass ich das Verschieben der Dateien nicht berücksichtigen brauch. Ich will auch ehlich sagen, dass mir an der Stelle der Aufwand zu übertrieben scheint.

@0x...irgendwas:
Dank für den Hinweis auf GetDiskFreeSpace. Mir schwante schon so was. Um das Thema werd ich mich auf jeden Fall kümmern. Wenn ich schon den Slack Space mit lösche, dann ordentlich.

Ich bin für jede weitere Anregung dankbar. Entscheidend ist für mich nicht die Kürze des Codes, sondern dass die Funktion ordentlich umgesetzt ist.

Dank und Gruß oki

PS: Nicht, dass sich jemand wundert, ich will erst Infos sammeln und dann Coden. Ich werde aber auf jeden Fall die fertige Funktion hier posten.
42
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Datei sicher löschen

  Alt 9. Jun 2009, 19:41
Zitat von 0xF30FC7:
Der Einfachheit halber belegen Dateien bei den meisten Dateisystemen immer eine ganze Anzahl an Clustern (Cluster -> eine Ansamlung von Sektoren). Bei NTFS ist die Clustergröße normalerweise 4 KB (also 8 Sektoren). Also wenn eine Datei nur ein Byte groß ist, belegt sie trotzdem einen Cluster und somit 4 KB. Angenommen die Datei war irgendwann mal größer und wurde dann verkleinert, so befinden sich im Rest des letzten belegten Clusters (Slack Space) noch immer die Daten die dort mal waren. Entsprechend musst Du sicher stellen, daß Du bei Dateien deren Größe nicht zufällig durch die Clustergröße teilbar ist, auf die nächste Clustergrenze aufrundest.
Bei NTFS ist das ganze nochmal eine Nummer trickreicher: Files die kleiner als ein Cluster sind, werden innerhalb der MFT abgelegt. Sobald du da dann nachträglich was anfügen willst, wird ein neuer leerer Block reserviert und der ganze Inhalt umgelagert.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#15

Re: Datei sicher löschen

  Alt 9. Jun 2009, 19:54
Zitat von OldGrumpy:
Bei NTFS ist das ganze nochmal eine Nummer trickreicher: Files die kleiner als ein Cluster sind, werden innerhalb der MFT abgelegt. Sobald du da dann nachträglich was anfügen willst, wird ein neuer leerer Block reserviert und der ganze Inhalt umgelagert.
ich glaub vor kurzem gelesen zu haben, daß es 1050 Byte sind, also nichtmal ein ganzer Cluster

aber wenn es eh "einfach" sein soll und die betreffenden Dateien nicht verkleinert werden, dann würde es ausreichen, wenn die Dateien in ihrer aktuellen Dateigröße einfach einmal komplett mit 0 überschrieben werden und dabei der Slack Space ignoriert wird, denn da steht ja eventuell nur was "wichtiges" drin, wenn die Datei verkleinert wurde


PS: ich erwähne jetzt hier lieber nicht noch die Sparse-Dateien, komprimierten Dateien, die Junctions und was es sonst noch im NTFS gibt
$2B or not $2B
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Datei sicher löschen

  Alt 9. Jun 2009, 19:55
Zitat von OldGrumpy:
Bei NTFS ist das ganze nochmal eine Nummer trickreicher: Files die kleiner als ein Cluster sind, werden innerhalb der MFT abgelegt. Sobald du da dann nachträglich was anfügen willst, wird ein neuer leerer Block reserviert und der ganze Inhalt umgelagert.
Bleibt dann der originale "kleine" Bestandteil der Datei in der MFT? Und wie bekomme ich den da weg?

Dank für deinen Beitrag OldGumpy und Gruß

oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#17

Re: Datei sicher löschen

  Alt 9. Jun 2009, 20:03
die MFT auslesen, direkten Zugriff auf Datenträger erlangen, MFT suchen, alle Mapping-LCNs der MFT besorgen, die MFT nach der Datei durchsuchen, die Position in der MFT berechnen, über die LCNs die Postition auf der Platte bestimmen und dann da löschen


Legst du die Dateien selber an?
dann reservier Anfangs volle ihre Dateigröße und schreib erst danach die Daten da rein.

bzw. müssen die Dateien unbedingt auf den Datenträger?
notfalls direkt im RAM behalten.



PS: vergiß nicht, wenn du die Dateien verarbeitest und etwas da rauslädst, dann könnten diese Daten über die Auslagerungsdatei auch auf der Platte landen.


Datensicherheit ist schon ein schlimmes Thema
$2B or not $2B
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Datei sicher löschen

  Alt 9. Jun 2009, 20:29
Zitat von himitsu:
Datensicherheit ist schon ein schlimmes Thema


Vorallem, wenn man das liest.

Ich erstelle die Dateien nicht, leider. Ich entpacke sie und speichere sich temporär zwischen. Z.B. um sie durch eine Anwendung zu öffnen. Somit hab ich erst mal keinen Einfluss auf die Länge. Der Rest wird mir dann aber nicht erpart bleiben. Das Thema Auslagerung uf die Platte ist mir noch gar nicht in den Sinn gekommen
Noch ne Baustelle.

Thema nur in den RAM laden. Würde ich gerne, das Problem ist aber, dass die Dateien durch externe Anwendungen geöffnet werden sollen (Word, AcrobatReader, IE etc.). Bis jetzt habe ich noch nichts gefunden, was das Laden einer Datei in eine Anwendung ermöglicht, ohne diese als physisches File zur Verfügung zu stellen. Ich denke mal RAM fällt damit aus, so schön es auch sein könnte.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#19

Re: Datei sicher löschen

  Alt 6. Nov 2009, 14:29
Ich hab die erste Version mal weitergeschrieben und das ganze läuft sehr gut - mit AssignFile.
Hat ein "Filestream mit fs.WriteBuffer" Vorteile gegenüber "AssignFile und Blockwrite"? (Performance?)
Kann ich bei AssignFile auch ein FlushFileBuffers umsetzen (Dazu brauch ich aber ein Filehandle) ?

Delphi-Quellcode:
  
AssignFile(f, Name3);
Reset(f, 1);
...
Buffer[j] := random(256); //Buffer mit Random Data füllen
BlockWrite (f, Buffer, Buffersize);
Delphi-Quellcode:
fs := TFileStream.Create(filename, fmOpenReadWrite or fmShareExclusive);
... buffer := StringofChar(Fillchars[i], BLOCK_SIZE);
... fs.WriteBuffer(buffer[1], BLOCK_SIZE);
... FlushFileBuffers(fs.Handle);
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat
XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#20

Re: Datei sicher löschen

  Alt 22. Jan 2010, 19:46
Der Thread ist zwar nun 2 Monate alt, aber falls es noch von Interesse ist siehe hier.

Gruß Xoric
"Gods are fragile things; they may be killed by a whiff of science or a dose of common sense."
- Chapman Cohen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz