Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Truncate/SetEndOfFile, verhindern das Datei genullt wird (https://www.delphipraxis.net/127476-truncate-setendoffile-verhindern-das-datei-genullt-wird.html)

Sunlight7 14. Jan 2009 04:12


Truncate/SetEndOfFile, verhindern das Datei genullt wird
 
Moin DP!

Mich nervt gerade das Problem, das mir (große) Dateien immer genullt werden, was mir zu lange dauert, für meine Zwecke unnötig ist und meine Nerven strapaziert...

Ums auf den Punkt zu bringen hab ich einen Test QT gemacht:
Delphi-Quellcode:
   var F:File;
    i:Cardinal;
    PC:Array[0..65535] of Char;
begin
   AssignFile(F, 'L:\~Test.tmp');
   ReWrite(F, 1);
   i:=1 * 1024 * 1024 * 1024;
   Seek(F, i+65536);
   Truncate(F);
   Seek(F, i);
   BlockWrite(F, PC, 65536); // Hier haben wir das Die-Lämmer
   CloseFile(F);
end;
Sobald ich Daten ans Ende der Datei schreibe wird die komplette Datei von Anfang bis FilePos genullt :evil: und erst dann die eigentlichen Daten geschrieben...

Ich habs versucht, die Datei (mit der Größe) zu erstellen, schließen, öffnen und dann ans Ende schreiben, aber das half nix, sie wurde wieder genullt :roll:

Dann hab ichs direkt mit der WinAPI versucht, aber auch da war der selbe Effekt :(


Wie kann ich ans Ende einer Datei schreiben ohne das alles davor genullt wird? :gruebel:


MfG, Sun

himitsu 14. Jan 2009 08:33

Re: Truncate/SetEndOfFile, verhindern das Datei genullt wird
 
Zitat:

Dann hab ichs direkt mit der WinAPI versucht, aber auch da war der selbe Effekt
Die Delphi-Funktionen greifen fast direkt auf die WinAPI zu und dieses hier ist nunrmal ein Verhalten dieser API.


Truncate entspricht sozusagen MSDN-Library durchsuchenSetEndOfFile

Seit WinXP gibt es MSDN-Library durchsuchenSetFileValidData, aber selbst hatte ich dieses, aus Sicherheitsgründen und da ich es Schlußendlich doch anders gelößt hab, am Ende doch nicht verwendet
Zitat:

Zitat von MSDN
Warning Use of this function without proper security considerations may compromise data privacy and security.

Ich glaub bei der ganzen Sache mußt du auch noch mit einberechnen, ob die Datei komprimiert (MSDN-Library durchsuchenFILE_ATTRIBUTE_COMPRESSED) ist, da es (glaub ich) die Datengröße auf der Platte setzt (ist schon 'nen Weilchen her, wo ich damit gespielt hatte)

nahpets 14. Jan 2009 09:57

Re: Truncate/SetEndOfFile, verhindern das Datei genullt wird
 
Hallo,
Zitat:

Zitat von Delphi-Hilfe
Rewrite (Prozedur)
Die Prozedur erstellt eine neue Datei und öffnet sie anschließend.

Da dürfte das Problem liegen.

himitsu 14. Jan 2009 10:33

Re: Truncate/SetEndOfFile, verhindern das Datei genullt wird
 
nee, sobald man die Datei vergrößert ... wie auch immer (außer man schreibt über das Dateiende hinaus und vergrößert so), wird "immer" mit 0 gefüllt ... damit kommen "normale" Programme nicht an alte Dateidaten/Datenstrukturen auf der Platte ran, indem sie einfach 'ne Datei erstellen und schauen was drin ist ... Datensicherheit halt

Sunlight7 14. Jan 2009 18:40

Re: Truncate/SetEndOfFile, verhindern das Datei genullt wird
 
Oha, Danke für den Tipp, mit SetFileValidData klappt das wirklich :hello:

Obs ein Problem gibt, wenn die Dtei komprimiert ist guck ich noch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 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