Copiar arquivo

Delphi

20/08/2003

Como copiar arquivo pelo Windows? Sem gozação heim..

Preciso copiar alguns gigas de arquivos e gostaria de exibir o progresso da cópia, mas já temos isso no windows e como faço pra usar?


Okama

Okama

Curtidas 0

Respostas

Inutaishou

Inutaishou

20/08/2003

O quue você quer fazer? Copiar arquivos pelo Windows ou por um programa em Delphi???


GOSTEI 0
Okama

Okama

20/08/2003

Copiar pelo Delphi, usando a API do Windows... :lol:


GOSTEI 0
Nildo

Nildo

20/08/2003

USe esta funcao que e criei. Um pouco mais rapido que o CopyFile, e com Progresso.

Declare a variavel fPararCopia no Private.
Caso queira cancelar no meio, entao use

fPararCopia := True;

Coloque um TGauge no Form, e use a funcao abaixo:

function DoCopyFile(const SrcFile, DstFile: string; var progresso: TGauge): Boolean;
const
  bufSize = 50000;
var
  sStream,
  dStream : TFileStream;
  pBuf    : Pointer;
  cnt     : Integer;
  totCnt, strmSize: Int64;
begin
  Result := True;
  fPararCopia := False;
  totCnt := 0;

  try
    sStream := TFileStream.Create(SrcFile, fmOpenRead or fmShareDenyWrite);
  except
     on E: Exception do
     begin
        Result := False;
        Exit;
     end;
  end;

{  progresso.Visible := sStream.Size > ((1.5 * 1024) * 1024); // Maior que 1.5Mb}
  Progresso.MinValue := 0;
  Progresso.MaxValue := 100;
  Progresso.Progress := 0;

  strmSize := sStream.size;

   try
     try
        dStream := TFileStream.Create(DstFile, fmCreate or fmShareExclusive);
     except
        on E: Exception do
        begin
           Result := False;
           Exit;
        end;
     end;

     try
       GetMem(pBuf, bufSize);
       try
         cnt := sStream.Read(pBuf^, bufSize);
         cnt := dStream.Write(pBuf^, cnt);

         totCnt := totCnt + cnt;
         while (cnt > 0) do
         begin
           If fPararCopia then
              Break;

           cnt := sStream.Read(pBuf^, bufSize);
           cnt := dStream.Write(pBuf^, cnt);

           totcnt := totcnt + cnt;
           progresso.Progress := Round((totCnt / strmSize) * 100);
           Application.ProcessMessages;
         end;

       finally
         FreeMem(pBuf, bufSize);
       end;
     finally
       dStream.Free;
       if fPararCopia then {Se cancelar entao deleta o arquivo}
         DeleteFile(PChar(DstFile));
     end;
   finally
     sStream.Free;
   end;
end;



GOSTEI 0
Hamilton Dias

Hamilton Dias

20/08/2003

var
Dados: TSHFileOpStruct;
begin
FillChar(Dados,SizeOf(Dados), 0);
with Dados do
begin
wFunc := FO_COPY;
pFrom := PChar(´c:\SISTEMA\*.*´);
pTo := PChar(´C:\SISTEMA\INI\´);
fFlags:= FOF_ALLOWUNDO;
end;
SHFileOperation(Dados);
end;


GOSTEI 0
Nildo

Nildo

20/08/2003

Altere o BufSize para ocupar menos ou mais memoria ram ao copiar arquivo. Por exemplo: Quanto menor o BufSize, mais memoria fica livre, o progress fica mais exato (menores passos) mas a copia demora mais. O contrario acontece se o BufSize for quanto maior.

Eu uso o 50000 pois é rapido e deixa o progress mais exato.

t+


GOSTEI 0
Okama

Okama

20/08/2003

Valeu Nildo, era exatamente isso que eu precisava, estava desistindo e apelando pelo Windows.

Abraços.


GOSTEI 0
Okama

Okama

20/08/2003

Só um detalhes: Se a cópia for interrompida a função ainda retorna True.


GOSTEI 0
Nildo

Nildo

20/08/2003

hehe Vc pode ficar a vontade pra modifica-la
Eh que quando eu fiz a necessidade era outra. Entao nao importava se o cara parasse a copia, porque quando ele parava a copia eu chamava uma outra funcao direto. Mas pode modifica-la como vc quiser. Ahh.. jah q vc ta testando ela, tem como vc tirar a diferenca de tempo de uma coisa com o CopyFile e uma com minha funcao? Ainda nao testei issu hehe

Valews!
t+
abraços


GOSTEI 0
Okama

Okama

20/08/2003

Ok.

Copiando um arquivo de 1.374 para o Drive A:

Start Copy with DoCopyFile: 16:03:01:229
End   Copy with DoCopyFile: 16:04:34:624
Total Time: 1:33:395

Start Copy with CopyFile: 16:04:34:624
End   Copy with CopyFile: 16:05:39:417
Total Time: 1:04:793



GOSTEI 0
Nildo

Nildo

20/08/2003

HUm... not Thhaaaattttt bad
thank you


GOSTEI 0
Ruthenio

Ruthenio

20/08/2003

usei a função DoCopyFile e outras funções para copiar arquivo, o problema é que com todas elas ao copiar o arquivo pela rede a data de modificação é alterada. Preciso de uma forma de copiar um arquivo sem que a data de modificação altere . Alguém saberia como resolver este problema ?


GOSTEI 0
Nildo

Nildo

20/08/2003

parece que tem uma função que altera a data do arquivo. Só nao lembro qual é. Entao antes de copiar o arquivo voce deve salvar numa variavel a data dele. E depois voce reatribui a data antiga depois de copiar o arquivo inteiro.


GOSTEI 0
POSTAR