![]() |
File splitten
Hi,
ich war/bin auf der Suche nach einem Programm, mit dem man Dateien in Stücke zerteilen kann. Aber nicht wie 1000e Programme: in eine vorgegebene Anzahl Stücke, oder in Stücke einer vorgegebenen Größe! Ich brauche einen ganz bestimmten Abschnitt aus einer Datei, d.h. ich habe den Anfangspunkt und die Länge. Man soll es nicht glauben, aber sowas ist nicht zu finden - es sei denn, hier kannt jemand ein Programm, daß das kann. Also muß ich (mit meinen Anfängerkenntnissen) es mir wohl selbst programmieren. Ein paar Code-Schnipsel (mit Streams) habe ich mal probiert, aber entweder ich oder Delphi 2.0 hat die nicht verstanden. Aber byteweises Kopieren wäre doch "tödlich". Ich habe schonmal den Anfang gemacht: :coder:
Delphi-Quellcode:
oder auch:
var
QuellFile, ZielFile : String; FirstByte, LastByte : LongInt; begin ... end
Delphi-Quellcode:
Für Euch ist das doch bestimmt ein Leichtes.
var
QuellFile, ZielFile : String; FirstByte, AnzahlBytes : LongInt; begin ... end Aber bitte einen einfachen Code, den sogar ich verstehe. Und bitte keine Sonder-Vorraussetzungen (wie .NET oder superneue Units oder sowas), die Delphi2/Win9x nicht kennt. Wenn ich das Programm oder den Quellcode mal veröffentliche, will ich die Benutzer nicht nötigen, irgendwelche Treiber zu installieren. Falls das Kopieren schnell und sicher gehen würde, wäre es besonders Supa. Vielen Dank im Voraus! |
Re: File splitten
Morgähn, Roookie!
Was ist die Maximalgröße der Dateien die du von bis Auslesen willst? Wieviel Memory hast Du zur Verfügung? Wie schnell soll das ganze Auslesen gegen (spielt Performance eine Rolle?) Je nach dem was du an Resourcen hast, gibt es da unterschiedliche Ansätze! lg. |
Re: File splitten
Lade die Datei in einen Stream. Setzt den Dateizeiger an die gewünschte Anfangsposition und kopiere dann die Gewünschte Anzahl Bytes in einen neuen Stream. Das wäre das Prinzip.
|
Re: File splitten
Geht das auch mit
![]() |
Re: File splitten
Hallo Delphianer, bei D2 ist die Streambehandlung noch sehr jungfräulich implementiert.
So sollte es dennoch ohne Probleme funktionieren.
Delphi-Quellcode:
Also Morgähn, und lg.
{$R+} {$Q+} {$I+}
function ReadOffset(AStartOffset: LongWord; AEndOffset: LongWord; ASourceFile: PChar; ADestFile: PChar): LongBool; var hSrcFile, hDestFile: LongWord; ptrBuffer: pointer; cbLen: LongWord; cbRead, cbWritten: LongWord; begin result := false; ptrBuffer := nil; cbLen := AEndOffset - AStartOffset; //-- AStartOffset muss immer kleiner als AEndOffset sein if cbLen > 0 then begin //-- Existierendes File öffnen hSrcFile := CreateFile(ASourceFile, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //-- Wenn Ok dann weiter if hSrcFile <> INVALID_HANDLE_VALUE then begin //-- Offset ausgehend vom Anfang der Datei setzen, also beginnend von. if SetFilePointer(hSrcFile, AStartOffset, nil, 0) <> $FFFFFFFF then begin //-- Vom Heap Speicher für die zu lesende Daten anfordern GetMem(ptrBuffer, cbLen); //-- Anzahl der Bytes = AEndOffset - AStartOffset in den Buffer lesen if ReadFile(hSrcFile, ptrBuffer^, cbLen, cbRead, nil) then begin //-- wenn alle Ok weiter if cbLen = cbRead then begin //-- OutPut File erstellen hDestFile := CreateFile(ADestFile, GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); //-- Wenn Ok dann weiter if hDestFile <> INVALID_HANDLE_VALUE then begin //-- Die zuvor gelesenen Daten in das Output File schreiben result := WriteFile(hDestFile, ptrBuffer^, cbLen, cbWritten, nil); //-- OutPut File schließen CloseHandle(hDestFile); end; //-- if hDestFile <> INVALID_HANDLE_VALUE then begin end; //-- if cbLen = cbRead then begin end; //-- if ReadFile(hSrcFile, ptrBuffer^, cbLen, cbRead, nil) then begin FreeMem(ptrBuffer, cbLen); end; //-- if SetFilePointer(hSrcFile, AStartOffset, nil, 0) <> $FFFFFFFF then begin CloseHandle(hSrcFile); end; //-- if hSrcFile <> INVALID_HANDLE_VALUE then begin end; //-- if cbLen > 0 then begin end; {$R-} {$Q-} {$I-} |
Re: File splitten
Zitat:
|
Re: File splitten
Zitat:
![]() Zitat:
Diese Antwort ging zum großen Teil an "alzaimar", der auch in diesem Thread (bisher) nichts Konstruktives beigetragen hat. Ich denke mal, das Programm sollte ab 512 MB phys.RAM laufen können, mehr als 1 GB RAM (500 GB frei/nutzbar) aber auf keinen Fall. Zitat:
Zitat:
Zitat:
Zitat:
Ist zwar viel größer als gedacht, aber werd's mal testen. Leider finde ich meine vorgeschlagenen Variablen-Namen darin nicht. Werde ganz schön grübeln müssen, um da was zu kapieren (trotz guter Dokumentation). Mir fällt jetzt schon auf: LongWord + LongBool habe ich in Delphi2 noch nie gesehen. Kann ich an "ASourceFile: PChar; ADestFile: PChar" die Dateinamen als String übergeben? |
Re: File splitten
Zitat:
|
Re: File splitten
Zitat:
Delphi-Quellcode:
oder du paßt den Code an
ReadOffset(FirstByte, FirstByte + AnzahlBytes - 1, PChar(QuellFile), PChar(ZielFile));
Delphi-Quellcode:
und im Code dieses ersetzen
function ReadOffset(FirstByte, AnzahlBytes: LongWord; const QuellFile, ZielFile: String): Boolean;
Code:
AStartOffset > FirstByte
AEndOffset > FirstByte + AnzahlBytes - 1 ASourceFile > PChar(QuellFile) ADestFile > PChar(ZielFile) bzw: cbLen := AnzahlBytes; |
Re: File splitten
Ich habe keine Ahnung, in wie fern in Delphi 2 schon implementiert sind, aber mit diesen methoden / eigenschaften müsstest Du es hingekommen:
StreamName.Create(...) StreamName.Seek(...) StreamName.CopyFrom(...) (im ZielDatei-Stream) StreamName.Size; Mehr Befehle wie diese zusammen mit 2 Streams brauchst Du nicht, um eine Datei in einem bestimmten Bereich zu zerlegen bzw. einen bestimmten "Bereich" herauszukopieren. Und danach den Speicher freigeben nicht vergessen. Sind wirklich nur wenige Zeilen und ist sehr einfach! SCRaT |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz