Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi CopyFrom 0-Byte Fehler (https://www.delphipraxis.net/22867-copyfrom-0-byte-fehler.html)

CReber 25. Mai 2004 13:05


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;

nailor 25. Mai 2004 13:13

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

CReber 25. Mai 2004 13:39

Re: CopyFrom 0-Byte Fehler
 
Delphi-Quellcode:
      try
        try
          outfile.CopyFrom(decompr,l);
        except
          on e:exception do
            Continue;
        end;
      finally
        outfile.Free;
        decompr.Free;
      end;
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 ;)

CReber 25. Mai 2004 14:07

Re: CopyFrom 0-Byte Fehler
 
kann mir wer sagen wie ich jetzt aus dieser infile heraus die größe einer datei auslesen kann?

Muetze1 26. Mai 2004 10:36

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:
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;
MfG
Muetze1

CReber 26. Mai 2004 17:13

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ß ?!

Muetze1 26. Mai 2004 18:52

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 18:48 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