(Des)Compactação com ZLib
Saudações Amigos.
Estive lendo o tópico [url=http://scriptbrasil.com.br/forum/index.php?showtopic=91047]http://scriptbrasil.com.br/forum/index.php?showtopic=91047[/url] e estou utilizando o código para fazer alguns testes de compactação com TCompressionStream e TDecompressionStream da ZLib segundo o código postado retirado do ´Torry´s Delphi Pages´
O algoritmo funciona apenas quando se tem [b:a8a06f7195]mais de 1[/b:a8a06f7195] arquivo compactado. Digo isso porque eu estou tentando descompactar um único mísero arquivo e a linha ´infile.Read(c,SizeOf( c )); { number of files }´ me retorna um número gigante e na segunda iteração do FOR dá erro de criação de arquivo referenciando o arquivo desta forma: ´C:\TEMP\C:\TEMP\TESTE.EXE´. Eu deduzo que na segunda iteração o bendito esteja copiando o caminho do arquivo então eu comentei o ´S := [b:a8a06f7195]Dest[/b:a8a06f7195]+S´ e adicionei o ´[b:a8a06f7195]Dest[/b:a8a06f7195]´ no ´outfile := TFileStream.Create(s,fmCreate);´ ficando assim ´outfile := TFileStream.Create([b:a8a06f7195]Dest+[/b:a8a06f7195]s,fmCreate);´. Mas mesmo assim ele me retorna um erro, desta vez diferente ´Stream read error´.
[b:a8a06f7195][color=red:a8a06f7195]Detalhe Importante:[/color:a8a06f7195][/b:a8a06f7195] o único arquivo compactado retorna ao seu tamanho original, então porque o algoritmo me retorna erro?
Alguém conseguiu fazer esse código funcionar?
Seguem meus códigos
Estive lendo o tópico [url=http://scriptbrasil.com.br/forum/index.php?showtopic=91047]http://scriptbrasil.com.br/forum/index.php?showtopic=91047[/url] e estou utilizando o código para fazer alguns testes de compactação com TCompressionStream e TDecompressionStream da ZLib segundo o código postado retirado do ´Torry´s Delphi Pages´
O algoritmo funciona apenas quando se tem [b:a8a06f7195]mais de 1[/b:a8a06f7195] arquivo compactado. Digo isso porque eu estou tentando descompactar um único mísero arquivo e a linha ´infile.Read(c,SizeOf( c )); { number of files }´ me retorna um número gigante e na segunda iteração do FOR dá erro de criação de arquivo referenciando o arquivo desta forma: ´C:\TEMP\C:\TEMP\TESTE.EXE´. Eu deduzo que na segunda iteração o bendito esteja copiando o caminho do arquivo então eu comentei o ´S := [b:a8a06f7195]Dest[/b:a8a06f7195]+S´ e adicionei o ´[b:a8a06f7195]Dest[/b:a8a06f7195]´ no ´outfile := TFileStream.Create(s,fmCreate);´ ficando assim ´outfile := TFileStream.Create([b:a8a06f7195]Dest+[/b:a8a06f7195]s,fmCreate);´. Mas mesmo assim ele me retorna um erro, desta vez diferente ´Stream read error´.
[b:a8a06f7195][color=red:a8a06f7195]Detalhe Importante:[/color:a8a06f7195][/b:a8a06f7195] o único arquivo compactado retorna ao seu tamanho original, então porque o algoritmo me retorna erro?
Alguém conseguiu fazer esse código funcionar?
Seguem meus códigos
procedure TForm1.CompressFiles(Files : TStrings; const Filename : String);
var
InFile, OutFile, TmpFile : TFileStream;
Compr : TCompressionStream;
I, L : Integer;
S : String;
begin
if Files.Count > 0 then
begin
OutFile := TFileStream.Create(Filename,fmCreate);
try
{ the number of files }
L := Files.Count;
OutFile.Write(L,SizeOf(L));
for I := 0 to Files.Count-1 do
begin
InFile := TFileStream.Create(Files[I],fmOpenRead);
try
{ the original filename }
S := ExtractFilename(Files[I]);
L := Length(S);
OutFile.Write(L,SizeOf(L));
OutFile.Write(S[1],L);
{ the original filesize }
L := InFile.Size;
OutFile.Write(L,SizeOf(L));
{ compress and store the file temporary}
TmpFile := TFileStream.Create(´tmp´,fmCreate);
Compr := TCompressionStream.Create(clMax,TmpFile);
try
Compr.CopyFrom(InFile,L);
finally
Compr.Free;
TmpFile.Free;
end;
{ append the Compressed file to the destination file }
TmpFile := TFileStream.Create(´tmp´,fmOpenRead);
try
OutFile.CopyFrom(TmpFile,0);
finally
TmpFile.Free;
end;
finally
InFile.Free;
end;
end;
finally
OutFile.Free;
end;
DeleteFile(´tmp´);
end;
end;
procedure TForm1.DecompressFiles(const Filename, DestDirectory : String);
var
Dest,S: String;
Decompr: TDecompressionStream;
InFile, OutFile: TFilestream;
I,L,C: Integer;
begin
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(Dest+S,fmCreate);
Decompr := TDecompressionStream.Create(InFile);
try
OutFile.CopyFrom(Decompr,L);
finally
OutFile.Free;
Decompr.Free;
end;
end;
finally
InFile.Free;
end;
end;Marcosrocha
Curtidas 0
Respostas
Nerdex
05/12/2007
Amigo, escrevi isto a décadas, bastava vc dar uma procurada antes:
[url]http://forum.devmedia.com.br/viewtopic.php?t=61350&highlight=[/url]
[url]http://forum.devmedia.com.br/viewtopic.php?t=61350&highlight=[/url]
GOSTEI 0
Marcosrocha
05/12/2007
NerdeX
Esse seu código funciona com compactação e descompactação de apenas 1 arquivo ou também funciona com 2 ou mais? Porque esse código eu tenho também e ele é usado apenas para 1 arquivo. No caso eu queria que funcionasse tanto para 1 quanto para 200 arquivos.
Esse seu código funciona com compactação e descompactação de apenas 1 arquivo ou também funciona com 2 ou mais? Porque esse código eu tenho também e ele é usado apenas para 1 arquivo. No caso eu queria que funcionasse tanto para 1 quanto para 200 arquivos.
GOSTEI 0
Nerdex
05/12/2007
Amigo ... :shock:
Leia o tópico inteiro no qual te informei acima.
A resposta está lá.
Leia o tópico inteiro no qual te informei acima.
A resposta está lá.
GOSTEI 0
Nerdex
05/12/2007
Olha aí ô:
Mamão com açúcar ... :roll:
[url]http://forum.clubedelphi.net/viewtopic.php?t=60429&postdays=0&postorder=asc&start=0[/url]
Mamão com açúcar ... :roll:
[url]http://forum.clubedelphi.net/viewtopic.php?t=60429&postdays=0&postorder=asc&start=0[/url]
GOSTEI 0