Board logo

标题: [讨论] CMD 下进度条实用化的问题。[求精] [打印本页]

作者: flyinspace     时间: 2007-4-2 03:17    标题: [讨论] CMD 下进度条实用化的问题。[求精]

经过目前的测试。。大家觉得好的话。请给我加分。呵呵 复制文件的进度条显示问题得到初步解决! 利用点: start /min copy 路径:\文件名 路径:\做多线程的运行。。 难点:获取硬盘拷贝文件的速率问题。 自己写了一个批处理做为测试,该值为每微妙/86000字节(值向上取整的结果) 注意,不同规格的硬盘有不同的结果。 需要大家自己测试。(自己已经解决,而且做为进度条提示就是评估复制时间) 算法思想。 1,利用 dir 指令获取 拷贝 文件的文件大小。 2,文件大小除去硬盘传输速率得到动画的延时时间 3,利用这个时间写动画。 我在下面的一楼里就直接把这个代码给出来了。 注:代码经过精简,省去了第一步。。(因为是算法嘛:) [ Last edited by flyinspace on 2007-4-1 at 02:34 PM ]

作者: flyinspace     时间: 2007-4-2 03:17    标题: 先用一楼。一会发代码

@echo off & SetLocal EnableDelayedExpansion set BackSpace= set RateBar=□ set Rate=0 set AllFile=1 set ExistFile=0 set FileName=测试.rar set /a FileSize=42719467 set /a CopySpeed=86500 set /a UseTime=%FileSize%/%CopySpeed% set /a ShowTime=%UseTime%/100 set Rate_Num=0 set Space_Num=11 set /p=正在拷贝文件:[%FileName%],需用时间:%UseTime%微秒<nul & echo. echo --------------------------------------------------- rem start /min [path]FileName [path] set /p=目前已经完成: <nul for /l %%i in (0,1,100) do ( set /a output=%%i%%10 if "!output!"=="0" ( rem echo The %%i Time set /p=!BackSpace!<nul set /a Space_Num=!Space_Num!-1 set /a Rate_Num=!Rate_Num!+1 call :PutChar !Rate_Num! !Space_Num! ) if %%i LSS 10 set /p=: %%i%%<nul if %%i GEQ 10 set /p=: %%i%%<nul call :ProcDelay %ShowTime% set /p=<nul ) echo. echo 拷贝已经完成! echo. goto EXIT ::::::::::::::输出空格::::::::::::::::::::::: :PutChar _num_ _a_ for /l %%i in (1,1,%1) do ( rem echo !RateBar! set /p=!RateBar!<nul ) for /l %%i in (1,1,%2) do ( set /p= <nul ) goto :EOF ::::::::::::::延时子程序::::::::::::::::::::: :ProcDelay _Delay_ for /f "tokens=1-4 delims=:. " %%i in ("%time%") do set start=%%i%%j%%k%%l :_TimeReturn_ for /f "tokens=1-4 delims=:. " %%i in ("%time%") do set end=%%i%%j%%k%%l set /a s=%end%-%start% if %s% LSS %1 goto _TimeReturn_ ENDLOCAL & GOTO :EOF :EXIT pause [ Last edited by flyinspace on 2007-4-1 at 02:25 PM ]

作者: flyinspace     时间: 2007-4-2 03:55
其实,该代码不少代码都是借鉴别人的。 例如延时子程序。(作者未知) 但其他的则是根据c++里面的算法。。 利用set /p的特性完成的。。 这个程序和网上已经有的进度条不同。。 是可以实用化的。

作者: zh159     时间: 2007-4-2 04:06
思路不错,但是硬盘传输速率随文件大小一般变化较大,而且微秒值太小,批处理基本反映不过来,毫秒也勉强 [ Last edited by zh159 on 2007-4-1 at 03:10 PM ]

作者: flyinspace     时间: 2007-4-2 04:09
楼上提得不错。 因为是提出算法。 所以没有给出错误的判断。。。 在我编写的实际批处理例子中。我的方法有不同。。 如果文件的大小小于 86000 * 10 则,动画过程没有延时。。。 2,争对不同的硬盘。我获取硬盘的速率是根据拷贝一个cmd.exe 到 另一个盘的时间做为基准的。。。 3,还有判断,若是同一个盘内的拷贝,也是动画没有延时的。。 这个是实际应用的处理。。 目前还在测试中,就没有在这里献丑了。 提出上面的算法只是把个人的思路提出来和大家一起讨论。。。 实际的代码已经有 32K大小了。。 而且测试也非常成功,只是在copy文件太大的时候,会有点不准。。有1到3秒的误差。 [ Last edited by flyinspace on 2007-4-1 at 03:27 PM ]

作者: huzixuan     时间: 2007-4-2 07:01
饿,没看懂

作者: flyinspace     时间: 2007-4-2 09:34
那里不懂呢??

作者: uiopuiop     时间: 2007-10-2 12:39
运行命令行X(比如COPY 一个大文件)但它要等运行完后才能执行其他代码,有没有办法让它和进度条同时执行和显示?

作者: electronixtar     时间: 2007-10-2 12:48
copy /z

作者: jaceyxp     时间: 2009-1-12 15:02
我要运行: xcopy c:\abc\*.* /s d:\aaa /y 这个命令加在那里??