![]() |
CopyFrom 0-Byte Fehler
Ich verwende folgenden Code um eine gepackte File zu entpacken aber wenn ich eine 0-Byte Datei kopieren "muss" macht er bei CopyFrom einen Fehler... Hat jemand eine Idee wie das elegant umgehen kann?
Delphi-Quellcode:
procedure DecompressFiles(const Filename, DestDirectory : String);
var dest,s : String; decompr : TDecompressionStream; infile, outfile : TFilestream; i,l,c : Integer; begin // IncludeTrailingPathDelimiter (D6/D7 only) dest := IncludeTrailingPathDelimiter(DestDirectory); infile := TFileStream.Create(Filename,fmOpenRead); try { number of files } infile.Read(c,SizeOf(c)); for i := 1 to c do begin { read filename } infile.Read(l,SizeOf(l)); SetLength(s,l); infile.Read(s[1],l); { read filesize } infile.Read(l,SizeOf(l)); { decompress the files and store it } s := dest+s; //include the path outfile := TFileStream.Create(s,fmCreate); decompr := TDecompressionStream.Create(infile); try outfile.CopyFrom(decompr,l); // <-- HIER ENTSTEHT DER FEHLER finally outfile.Free; decompr.Free; end; end; finally infile.Free; end; end; |
Re: CopyFrom 0-Byte Fehler
ich weiß nicht, ob es nicht noch eleganter geht, aber du könntest entweder eine größenabfrage einbauen, ober mit einer weiteren try-except schleife arbeiten
|
Re: CopyFrom 0-Byte Fehler
Delphi-Quellcode:
Ich habs jetzt so gemacht aber irgendwie funzt das auch nicht... jede file nach ner 0-byte datei wird auch 0-byte groß! irgendwo fehlt mir grad der ansatz ;)
try
try outfile.CopyFrom(decompr,l); except on e:exception do Continue; end; finally outfile.Free; decompr.Free; end; |
Re: CopyFrom 0-Byte Fehler
kann mir wer sagen wie ich jetzt aus dieser infile heraus die größe einer datei auslesen kann?
|
Re: CopyFrom 0-Byte Fehler
Moin!
Wenn CopyFrom() in der Länge eine 0 bekommt, dann seeked er zum Anfang des Streams und kopiert alle vorhandenen Daten. Somit musst du einfach eine If Abfrage einbauen, ob der 2. Parameter bei CopyFrom() vielleicht 0 ist, wenn ja, dann CopyFrom() überspringen, sollte ja nicht so schwer sein.
Code:
MfG
procedure DecompressFiles(const Filename, DestDirectory : String);
var dest,s : String; decompr : TDecompressionStream; infile, outfile : TFilestream; i,l,c : Integer; begin // IncludeTrailingPathDelimiter (D6/D7 only) dest := IncludeTrailingPathDelimiter(DestDirectory); infile := TFileStream.Create(Filename,fmOpenRead); try { number of files } infile.Read(c,SizeOf(c)); for i := 1 to c do begin { read filename } infile.Read(l,SizeOf(l)); SetLength(s,l); infile.Read(s[1],l); { read filesize } infile.Read(l,SizeOf(l)); { decompress the files and store it } s := dest+s; //include the path outfile := TFileStream.Create(s,fmCreate); decompr := TDecompressionStream.Create(infile); try If ( l > 0 ) Then outfile.CopyFrom(decompr,l); // <-- HIER ENTSTEHT DER FEHLER finally outfile.Free; decompr.Free; end; end; finally infile.Free; end; end; Muetze1 |
Re: CopyFrom 0-Byte Fehler
Jetzt kommt immer die Meldung ich hätte zu wenig Arbeitsspeicher und die folgenden Dateien werden auch 0-byte groß ?!
|
Re: CopyFrom 0-Byte Fehler
Moin!
Schonmal debuggt? Wird vielleicht l immer mit 0 gelesen? Gibt es vielleicht besondere Daten die in dem Stream stehen, wenn l = 0 ist? MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 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