Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateien aufteilen/splitten (https://www.delphipraxis.net/64523-dateien-aufteilen-splitten.html)

mr47 4. Mär 2006 18:48


Dateien aufteilen/splitten
 
Hallo DPler! :-)

Ich hab schon gesucht und nur ein Programm von Luckie gefunden. Ich will Dateien (die auch mal bis zu 2 GB groß sein können) aufsplitten. Und zwar in relativ viele Teile. Also 2GB in z.B. 100 Teile oder so. Kann mir jemand helfen? Ich weiß überhaupt nicht wie ich das angehen soll...


Ich hoffe es ist alles klar. Danke im Voraus!

mr47 :hi:

SirThornberry 4. Mär 2006 18:54

Re: Dateien aufteilen/splitten
 
Der Ansatz ist recht einfach. Öffne die große Datei. Erstelle eine neue Datei (teil1.dat) und lese dann X Bytes aus der großen Datei und schreibe diese in die neue Datei. Nach X kopierten Bytes erstellst du die nächste Datei und kopierst dort die nächsten Teile rein. Mit TFilestream ist das recht einfach. Einfach die Methode CopyFrom nehmen und angeben wieviel Bytes kopiert werden sollen.

mr47 4. Mär 2006 19:06

Re: Dateien aufteilen/splitten
 
Hi!

Ok. Danke. Ich hab jetzt folgenden Code geschrieben (sorry für die Variablen namen). Er scheint auch zu funktionieren:
Delphi-Quellcode:
var tf: TFileStream;
    x: tFileStream;
begin
  x:=TFileStream.Create('F:\a.jpg',fmShareDenyWrite);
  tf:=TFileStream.Create('F:\1a.jpg.dat',fmCreate);
  tf.CopyFrom(x,1024);

  tf.Free;
  x.Free;

1. Nur jetzt ne blöde Frage. Wie krieg ich die Teildateien dann wieder zusammen? Steh grad auf der Leitung.
2. Wie kann ich eine Teildatei von Byte 2048 bis 3072 machen? Ich mein, wie fang ich mitten in der Datei mit dem Teilen an? Oder macht's das automatisch?
3. Was passiert wenn ich am Ende der Datei bin? Gibt's dann nicht ne AV?

mr47 und schon mal vielen Dank! :hi:



EDIT: Ok, die Fragen 2 und 3 haben sich von alleine, durch probieren erledigt. Wäre noch Frage 1! Danke

Der_Unwissende 4. Mär 2006 21:08

Re: Dateien aufteilen/splitten
 
Hi,
eigentlich bekommst du die so ziemlich genau so zusammen, wie du sie trennst.
Du erstellst einfach eine neue Datei, setzt den Positionszeiger auf 0 und schreibst nacheinander die Dateien (in richtiger Reihenfolge) rein. Mit dem schreiben wird der Positionszeiger automatisch weiter gesetzt.
Natürlich kannst du auch noch deine eigenen Dateien erweitern. Da deine Dateien auf 4 GByte beschränkt sein dürften, kannst du einfach zwei führende Cardinals in die gesplitteten Dateien setzen, einmal die ursprüngliche Position in der Datei und dann noch die größe in Bytes, die du in diese Datei geschrieben hast. Damit hast du dann die einfache Möglichkeit, weitere Daten ranzuhängen (z.B. einen Hash um zu prüfen in wie weit die Datei konsistent ist) und gleichzeitig spielt auch die Reihenfolge in der du die Dateien einliest keine Rolle mehr.

Gruß Der Unwissende

mr47 4. Mär 2006 22:50

Re: Dateien aufteilen/splitten
 
Hi! Vielen Dank erst mal.

Aaalso, das funktioniert ganz gut. Ich kann die Datei wieder zusammenfügen. Da die Dateien nummeriert sind und die auch nach dem splitten nicht mehr verändert werden, brauch ich das mit dem Cardinal in der Datei nicht.
Aber jetzt doch mal zu Frage 3, zwei Posts weiter oben. Wie stell ich am besten fest, wann die Datei am Ende ist. Bisher hab ich das mit einer While-Schleife und filestream.Size gemacht. Aber nach dem zussamenfügen fehlt unten im Bild ein kleines Eck. Das heißt der Code hat nicht richtig funktioniert. Wie kann ich die letzten Bytes, die also kleiner als eine Splitdatei sind, ermitteln?

Und dann noch eine Frage: Wie kann ich den Filestream wieder "schließen". Hab festgestellt, dass er nach dem benutzen immernoch die Dateien reserviert hat. Man kann von außen nicht drauf zugreifen... ein Filestream.Close wie beim Buffer gibt es nicht...


Danke, mr47 :hi:

Luckie 5. Mär 2006 13:38

Re: Dateien aufteilen/splitten
 
Die Datei wird automatisch geschlossen, wenn man den FileStream wieder freigibt.

mr47 5. Mär 2006 15:11

Re: Dateien aufteilen/splitten
 
Ich danke dir!!! :-)

mr47 :hi:


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