Ir para conteúdo
Fórum Script Brasil
  • 0

Compactar Pastas Com O Zlib


PeVermeio

Pergunta

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 para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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!

Editado por jaumDoDelphi
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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

Editado por jaumDoDelphi
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...