请教 拷贝文件夹带进度条 ( 积分: 100 )

  • 主题发起人 主题发起人 MaXsl
  • 开始时间 开始时间
M

MaXsl

Unregistered / Unconfirmed
GUEST, unregistred user!
RT&nbsp;<br>不要&nbsp;SHFileOperation
 
我觉得应该不是真的进度条,只是大概的显示
 
楼主不喜欢&nbsp;SHFileOperation&nbsp;倒是出乎俺意料,因为俺觉得显示进度条不是脑力活动,而是体力活动...<br>方法很简单:<br>1、需要一个定时器,间隔可以设为&nbsp;500&nbsp;ms...<br>2、用&nbsp;GetFileSize&nbsp;函数获得源文件大小:SrcFileSize<br>3、用&nbsp;CreateFile&nbsp;创建一个同样大小的目标文件...<br>4、用&nbsp;ReadFile&nbsp;读取源文件,用&nbsp;WriteFile&nbsp;写目标文件,累计写入字节/源文件大小,就是进度条上的进度...<br>5、全写完后,直接把进度条设成&nbsp;100%,然后该干吗干吗...<br>6、怎么样,是不是体力活...
 
學習學習。。。。。
 
我先遍历出需要拷贝的文件&nbsp;同时计算出大小&nbsp;然后依据stringlist每一个项目来COPY&nbsp;用当前拷贝的SIZE/文件的大小&nbsp;SIZE+已经拷贝的文件大小/总文件大小来实现进度条&nbsp;现在难点不是怎么实现&nbsp;是我写代码很不规范&nbsp;过一段时间可能我自己都看不懂&nbsp;所以我想找一下<br>&nbsp;请有能力的朋友帮帮忙
 
to&nbsp;vvyang;<br>因为我要设计的东西&nbsp;牵涉到要拷贝大文件<br>倒是有方法能把SHFileOperation&nbsp;掉出的窗体弄到程序中&nbsp;主要的就是拷贝大文件的时候SHFileOperation的速度实在不敢恭维
 
uses&nbsp;ShellApi;<br><br><br><br>function&nbsp;DoCopyDir(sDirName:String;sToDirName:String;CopyProgress:TProgressBar):Boolean;<br>var<br>&nbsp;&nbsp;hFindFile:TSearchRec;//Cardinal;<br>&nbsp;&nbsp;t,tfile:String;<br>&nbsp;&nbsp;sCurDir:String[255];<br>&nbsp;&nbsp;FindFileData:WIN32_FIND_DATA;<br>begin<br>&nbsp;&nbsp;//先保存当前目录<br>&nbsp;&nbsp;sCurDir:=GetCurrentDir;<br>&nbsp;&nbsp;ChDir(sDirName);<br>&nbsp;&nbsp;hFindFile.FindHandle&nbsp;:=FindFirstFile('*.*',FindFileData);<br>&nbsp;&nbsp;if&nbsp;hFindFile.FindHandle&nbsp;&lt;&gt;INVALID_HANDLE_VALUE&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;DirectoryExists(sToDirName)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForceDirectories(sToDirName);<br>&nbsp;&nbsp;&nbsp;&nbsp;repeat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tfile:=FindFileData.cFileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(tfile='.')&nbsp;or&nbsp;(tfile='..')&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;FindFileData.dwFileAttributes=&nbsp;FILE_ATTRIBUTE_DIRECTORY&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t:=sToDirName+'/'+tfile;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;not&nbsp;DirectoryExists(t)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForceDirectories(t);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;sDirName[Length(sDirName)]&lt;&gt;'/'&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoCopyDir(sDirName+'/'+tfile,t,CopyProgress)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoCopyDir(sDirName+tfile,sToDirName+tfile,CopyProgress);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t:=sToDirName+'/'+tFile;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyFile(PChar(tfile),PChar(t),True);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//XCopyFile(tfile,t);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyProgress.Position:=CopyProgress.Position&nbsp;+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;application.ProcessMessages;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;until&nbsp;FindNextFile(hFindFile.FindHandle&nbsp;,FindFileData)=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;FindClose(hFindFile);<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;ChDir(sCurDir);<br>&nbsp;&nbsp;&nbsp;&nbsp;result:=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;//回到原来的目录下<br>&nbsp;&nbsp;ChDir(sCurDir);<br>&nbsp;&nbsp;result:=true;<br>end;<br><br>//----&nbsp;1.2拷贝目录的函数:CopyDir<br><br>function&nbsp;CopyDir(sDirName:String;sToDirName:string;CopyProgress:TProgressBar):Boolean;<br>begin<br>&nbsp;&nbsp;if&nbsp;Length(sDirName)&lt;=0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;//拷贝...<br>&nbsp;&nbsp;pb.Min&nbsp;:=0;<br>&nbsp;&nbsp;Result:=DoCopyDir(sDirName,sToDirName,CopyProgress);<br>end;
 
To&nbsp;MaXsl:<br>&nbsp;&nbsp;如果不用系统的,想提高速度,可以看看&nbsp;FastCopy&nbsp;这个软件是怎么实现的,不过貌似他们不公布源码的说...
 
to&nbsp;weichao9999;<br>首先感谢对此问题的关注&nbsp;<br>这个方法应该说是模拟进度吧<br>用当前拷贝的文件数目/文件总数目.<br>但是当单个文件很大的时候这个进度条也太假了些吧&nbsp;&nbsp;<br>有朋友能按我的思路帮我写个代码吗?&nbsp;给我个结构也行<br>谢谢了
 
to&nbsp;vvyang;<br>我看过一个开源的代码<br>但是是C的&nbsp;水平很低&nbsp;看不懂的说
 
你改成每隔1秒扫描目标文件夹的大小,然后计算进度就可以了把
 
再问也问不出来&nbsp;揭贴
 
后退
顶部