文件拷贝:用CopyFile拷贝多个文件,在拷贝之前,如何估计拷贝所用的时间?
文件拷贝:用CopyFile拷贝多个文件,在拷贝之前,如何估计拷贝所用的时间? 问题点数:100、回复次数:18Top
1 楼SilveryFox(一天一点爱恋......)回复于 2002-11-29 13:34:08 得分 0
你试试可否根据字节流量计算(byrereceived/bytetotal)Top
2 楼mrfanghansheng(☆☆☆木鱼☆☆☆)回复于 2002-11-29 13:35:32 得分 0
学习……Top
3 楼wuxuan(真心英雄)回复于 2002-11-29 13:38:25 得分 0
先统计要COPY文件的大小,然后根据硬件传输速率来进行时间计算.Top
4 楼vmao(毛小毛)回复于 2002-11-29 13:43:07 得分 0
学习……
Top
5 楼cbdiy(暂无)回复于 2002-11-29 13:44:15 得分 0
用文件流 拷贝完全可以实现。。Top
6 楼stanely(俺是邢她汉子)回复于 2002-11-29 13:45:39 得分 0
gettickcountTop
7 楼happyzsl(学习)回复于 2002-11-29 14:36:08 得分 0
各位请说明白一点
另外:用文件流拷贝如何实现?Top
8 楼zwhhoo(我爱真理)回复于 2002-11-29 14:48:19 得分 0
CopyFile要简单,还是用它吧,计算出每个文件的大小,用这为依据。
文件流TFileStream.Create(FileName, fmCreate);Top
9 楼happyzsl(学习)回复于 2002-11-29 15:33:29 得分 0
怎么知道copyfile的速度???Top
10 楼cneast(东东)回复于 2002-11-29 17:05:46 得分 0
用ShFileOperation不是更好吗?Top
11 楼linx88(haozi)回复于 2002-11-29 18:02:09 得分 0
统计所有文件大小,和记录没个文件大小,先安预先得到的速度估计时间,每次完成一个copyfile在估算一下剩余时间,不过这样得到的数据误差较大。你也可以用readfile,writefile来完成,得到的时间会比较准确。Top
12 楼happyzsl(学习)回复于 2002-11-30 11:05:35 得分 0
就是怎么得到速度啊Top
13 楼wxjh(农民)回复于 2002-12-01 21:04:24 得分 0
使用文件流,利用指针的位置,进行计算。。。。。OK~~
Top
14 楼RamjetZhang(万花从中一点红,玉树临风王小桃是也)回复于 2002-12-01 22:41:23 得分 0
你看windows自己显示的时间准过否?Top
15 楼stanely(俺是邢她汉子)回复于 2002-12-01 23:50:18 得分 0
你要估算?
先得到整个要复制的数据的大小,用timegettime得到复制之前的时间,并纪录下来,每复制10k或者一定数据以后监测现在时间,并跟最先纪录的时间比较,得到的商就是复制速度,那么剩下的数据量和速度的商,就是剩余时间。
理论上应该可行,因为如果数据总量很小,估算时间给用户看,也没什么意义,因为时间很短。
如果数据量大,就有意义了,比如自己做个安装程序,安装的时候估算剩余时间并显示在安装界面上。
关键就是每隔多少k估算一次,太小太大都没意义。我觉得取复制总量的1/20就够,上限是100k,下限1k,具体的还要你试验。
Top
16 楼xyxx(雪域雄师)回复于 2002-12-02 09:38:15 得分 0
学习。。。。Top
17 楼happyzsl(学习)回复于 2002-12-03 09:07:41 得分 0
使用CopyFileEx进行带进度条的文件复制
http://asp3.6to23.com/dever/windowsdev/file/file20.asp
CopyFileEx可以在copy期间撤销操作,主要利用系统的callback函数来取得相应的传输字节和文件大小来进行进度条的设置
//callback函数设置
Function CopyProgressRoutine(
TotalFileSize : Int64;
TotalBytesTransferred : Int64;
StreamSize : Int64;
StreamBytesTransferred : Int64;
dwStreamNumber : Cardinal;
dwCallbackReason : DWord;
hSourceFile : THandle;
hDestinationFile : THandle;
lpData : Pointer):Dword;
Begin
form1.Label1.Caption :='已复制' + floattostr( (Trunc((TotalBytesTransferred/(1024*1024))*100)/100) ) + 'M';
form1.ProgressBar1.Position := trunc((TotalBytesTransferred/StreamSize)*100);
form1.ProgressBar1.Update;
application.ProcessMessages;
Result := PROGRESS_CONTINUE;
end;
//copy代码
procedure TForm1.Button1Click(Sender: TObject);
begin
If CopyFileEx('e:\downfile\PW2002SP1.exe','d:\pw.exe',@CopyProgressRoutine,nil,PBool(0),COPY_FILE_RESTARTABLE) = false Then
RaiseLastOsError;
end;
Top
18 楼nice521(愉快人生)回复于 2002-12-03 11:26:53 得分 100
CopyFileEx只能在WIN2000或WINNT下使用。Top




