Jump to content
Fórum Script Brasil
  • 0

Compactar Pastas Com O Zlib


PeVermeio
 Share

Question

Aeee Galera do script Brasil, sou novato por aqui e vi, procurando por ferramentas de busca na net que é o melhor lugar pra resolver sobre dúvidas, espero que me ajudem beleza?

A dúvida é a seguinte: estou tentando fazer um módulo de backUp em meu sisteminha mas, gostaria de compactar a pasta DB (onde ficam minhas tabelas do Paradox), mas inteira.

... tipo, já sei como fazer com arquivos, mais ou menos assim:

Insira zLib no Uses da sua Unit...

procedure TForm1.CompressãoClick(Sender: TObject);

var

FileIni, FileOut: TFileStream;

Zip: TCompressionStream;

begin

FileIni:=TFileStream.Create('C:\pasta\...arquivo a ser comprimido...', fmOpenRead and fmShareExclusive);

FileOut:=TFileStream.Create('C:\pasta\...arquivo comprimido...', fmCreate or fmShareExclusive);

Zip:=TCompressionStream.Create(clMax, FileOut);

Zip.CopyFrom(FileIni, FileIni.Size);

Zip.Free;

FileOut.Free;

FileIni.Free;

end;

mas n consigo compactar a PASTA DB.

Aguardo respostas :D , vlw

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

opa

seguinte, a única coisa ruim é que somente seu programa poderá

descompactar, você não poderá abrir o arquivo compactado com

o Winzip, Winrar por exemplo... isso pode ser bom por um lado rs

baseado na fonte do torry

procedure EnumFiles(szPath, szAllowedExt: String; iAttributes: Integer;
  Buffer: TStrings; bClear, bIncludePath: Boolean); StdCall;
var
  res: TSearchRec;
  szBuff: String;
begin
  if (bClear) then Buffer.Clear;
  szPath := IncludeTrailingBackslash(szPath);
  if (FindFirst(szPath + szAllowedExt, iAttributes, res) = 0) then
  begin
    repeat
      szBuff := res.Name;
      if ((szBuff <> '.') and (szBuff <> '..')) then
      if (bIncludePath) then
      Buffer.Add(szPath + szBuff) else
      Buffer.Add(szBuff);
    until FindNext(res) <> 0;
    FindClose(res);
  end;
end;

procedure 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 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);

  ForceDirectories(Dest);

  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);
      finally
        outfile.Free;
        decompr.Free;
      end;
    end;
  finally
    infile.Free;
  end;
end;
ai pra compactar você faz exemplo, vamos supor que a pasta que você quer compactar é "C:\Meu Sistema\BD" e no click de um botao você coloca...
var
  slFiles: TStringList;
begin
  slFiles := TStringList.Create;
  EnumFiles('C:\Meu Sistema\BD\', '*', faAnyFile - faDirectory, slFiles, True, True);
  CompressFiles(slFiles, 'c:\Backup1.bkp');
  slFiles.Free;

repara que em C:\Backup1.bkp você troca pro nome do arquivo que deseja salvar o backup.

eu recomendaria você trocar pelo seguinte, exemplo

CompressFiles(slFiles, 'backup' + FormatDateTime('ddmmyy', Date) + FormatDateTime('HHmm', Time) + '.bkp');

Assim o nome do arquivo será a data e a hora em que foi salvo.... exemplo, hoje dia 16/12/06 e agora são 19:36

backup1612061936.bkp

Data

Hora

A extensão .bkp você pode trocar pra qualquer uma, somente para reconhecimento do tipo de

arquivo...

pra descompactar, baseado no primeiro exemplo você faz

DecompressFiles('C:\Backup1.bkp', 'C:\Meu Sistema\BD');

a vantagem de você usar Data e Hora pra salvar o arquivo de backup é que é uma mão na roda

pra achar um determinado backup de um tal dia...

abraço

Link to comment
Share on other sites

  • 0

Ola a todos!

Estou tendo problemas com este exemplo, o problema é na hora de descompactar os arquivos.

coloquei um exemplo no EASY-SHARE DOWNLOAD

Pelo que vi no ERRO do windows, quando ele tenta descompactar ele fica criando pastas com o nome dos arquivos!

tipo cao.jpg, gato.jpg

C:\zip\cao\gato\...

e na verdade quero descompactar na pasta c:\zip sem sub pastas.

aki em baixo tem a foto do ERRO

erroy.jpg

Quem poder me ajudar eu agradeço muito!

Edited by jaumDoDelphi
Link to comment
Share on other sites

  • 0

Use o componente ZipMaster:

http://www.delphizip.org/dz177.html

eu utilizo ele no meu sistema, é muito bom... baixa o zipmstr177.zip (1027k) ZipMaster VCL e o dll177.zip (290k) just the dlls e e quiser pode baixar o demo também demos177.zip (150k) Demos and Grid

Abraços

Link to comment
Share on other sites

  • 0

Saiu a versao para D2009 e D2010 do ZIPMASTER v1.90

Eu instalei o componente e testei!

Está funcionando muito bem! sem Bugs!

Mas estou com problemas para colocar PassWord

estou fazendo desta forma (*ZM = Zipmaster)

SDlg.FileName := NAME;

ZM.PasswordReqCount := 1; // tb já coloquei ZM.PasswordReqCount := 0;

ZM.Password := 'larinha';

if Sdlg.Execute then

begin

ZM.ZipFileName := SDlg.FileName;

ZM.FSpecArgs.Add('CSV\'+NAME+'\*.*');

ZM.Add;

// ShowMessage('Arquivos Compactado com Sucesso, Total: ' + IntToStr(ZM.SuccessCnt));

MessageBOX(handle,'Arquivo Compactado com Sucesso!', 'INFORMAÇÃO!', MB_OK + MB_ICONINFORMATION);

btnDELETE.OnClick(Sender);

end

Else

Close;

alguém sabe como colocar senha no arquivo ZIP via codigo? sem utilizar o comando - GetPassword()???

agradeço desde já!

***** consegui!

e a propriedade "Properties - AddOption [AddEncrypt]"

vlwz

Edited by jaumDoDelphi
Link to comment
Share on other sites

  • 0
Pelo que vi no ERRO do windows, quando ele tenta descompactar ele fica criando pastas com o nome dos arquivos!

tipo cao.jpg, gato.jpg

C:\zip\cao\gato\...

e na verdade quero descompactar na pasta c:\zip sem sub pastas.

aki em baixo tem a foto do ERRO

erroy.jpg

Quem poder me ajudar eu agradeço muito!

Desculpe ver isso tarde, mas ao que parece você está sendo vítima de uma armadilha do Delphi 2010.

Agora o Delphi trabalha inteiramente em UTF-16, não mais utilizando os caracteres ASCII. E como o windows funciona em ASCII, quando você está tentando salvar o arquivo o windows não reconhece o path que você está informando.

Para resolver essas questões, nas suas funções de arquivos, streams de sistema ou qualquer comunicação direta com o windows ao invés de declarar suas variáveis como "String" faça declarações como:

var

CaminhoArquivo: AnsiString;

A declaração da variável como AnsiString faz com que ela seja trabalhada pelo Delphi como ASCII, e não como UTF.

Espero ter ajudado.

Link to comment
Share on other sites

  • 0

Aaqui Jaz, Grande!

Funcionou sim! obrigado!

Mas agora, já estou utilizando o ZipMaster que é bem mais simples.

mas a sua ajuda foi muito ultil para o forum!

é tive varios problemas com o novo sistema de Codificação de Caracteres do novo delphi 2010!

porque na epoca que fiz os cursos era o Delphi7!

vlw e abraços!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      151k
    • Total Posts
      649.1k
×
×
  • Create New...