Copiar arquivo
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?
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
Curtidas 0
Respostas
Inutaishou
20/08/2003
O quue você quer fazer? Copiar arquivos pelo Windows ou por um programa em Delphi???
GOSTEI 0
Okama
20/08/2003
Copiar pelo Delphi, usando a API do Windows... :lol:
GOSTEI 0
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:
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
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;
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
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+
Eu uso o 50000 pois é rapido e deixa o progress mais exato.
t+
GOSTEI 0
Okama
20/08/2003
Valeu Nildo, era exatamente isso que eu precisava, estava desistindo e apelando pelo Windows.
Abraços.
Abraços.
GOSTEI 0
Okama
20/08/2003
Só um detalhes: Se a cópia for interrompida a função ainda retorna True.
GOSTEI 0
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
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
20/08/2003
Ok.
Copiando um arquivo de 1.374 para o Drive A:
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
20/08/2003
HUm... not Thhaaaattttt bad
thank you
thank you
GOSTEI 0
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
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