大家给点意见,文件复制中进度条processBar的使用

struts_velocity 2009-11-23 04:18:27
先前程序中有关文件复制我是用File.Copy()来实现的,但是我想用进度条表示复制的情况,怎么来控制进度变化
因为传说文件不是用文件流的形式,而是用来COPY()方法,实在想不到怎么控制进度条procesbar
会的大侠们给留点建议
...全文
1095 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2009-11-23
  • 打赏
  • 举报
回复
使用File.Copy()的确无法给出进度条,除非使用文件流。用API是否可以做到目前不知,但是如果为了实现File.Copy()实现不了的进度控制而是用API的话,还不如使用FileStream来实现文件复制更容易,FileStream的话,就可以获取文件复制的进度了。
jbo126 2009-11-23
  • 打赏
  • 举报
回复
如果嫌上面表现不“细”或者你设置一个值,如果文件的大小超过该值,就进一步使用流;如果小于该值直接复制!
jbo126 2009-11-23
  • 打赏
  • 举报
回复
简单点的,进度条的最大值设置为要复制文件的总大小,每复制完一个后将进度条的值加当前已复制文件的大小。
孤剑 2009-11-23
  • 打赏
  • 举报
回复
自己实现 copy 功能,建立 FileStream 即可。
happy664618843 2009-11-23
  • 打赏
  • 举报
回复
foreach读取文件夹、的文件
a093725846a 2009-11-23
  • 打赏
  • 举报
回复
mark mark 学习
kaizi_sun 2009-11-23
  • 打赏
  • 举报
回复
mark
wuyq11 2009-11-23
  • 打赏
  • 举报
回复

获取文件大小,再复制
ProgressBar.Value =10;
Application.DoEvents();
lblProgress.Text = ProgressBar.Value.ToString() + "%";

http://topic.csdn.net/u/20090611/10/69d24a2d-c2a3-42dd-ae89-739490a6bfef.html
rizher 2009-11-23
  • 打赏
  • 举报
回复
关注
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 much0726 的回复:]
http://blog.csdn.net/much0726/archive/2008/12/17/3541278.aspx
实时进度的。
[/Quote]

实时进度的
much0726 2009-11-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/much0726/archive/2008/12/17/3541278.aspx
实时进度的。
悔说话的哑巴 2009-11-23
  • 打赏
  • 举报
回复
直接获取文件的目录,读取里面的内容
特别 2009-11-23
  • 打赏
  • 举报
回复
估计除了用这法子,
没有其他办法了
因为在复制文件时,源文件有多大
文件目录表直接就写清楚了,
你怎么获取大小总是源文件大小
不管已经复制了多少

建议:
1、使用一个动画图片
2、ProgressBar用一Timer随便改变进度
3、7楼的方法,该方法可精确控制

[Quote=引用 7 楼 zcl24 的回复:]
作成两个进度 一个文件个数
一个为单个文件复制进度 这样就比较精确

单文件复制可以使用文件流读写的确定写入进度
C# codeusing (FileStream fs=new FileStream("file name", FileMode.Open, FileAccess.Read))
{
FileStream wf=new FileStream("new file name", FileMode.CreateNew, FileAccess.Write);byte[] buffer=newbyte[1024];int readbytes=0;do
{
readbytes= fs.Read(buffer,0,1024);
wf.Write(buffer,0,1024);
}while (readbytes<=0);
}
[/Quote]
zcl24 2009-11-23
  • 打赏
  • 举报
回复
作成两个进度 一个文件个数
一个为单个文件复制进度 这样就比较精确

单文件复制可以使用文件流读写的确定写入进度
            using (FileStream fs = new FileStream("file name", FileMode.Open, FileAccess.Read))
{
FileStream wf = new FileStream("new file name", FileMode.CreateNew, FileAccess.Write);
byte[] buffer = new byte[1024];
int readbytes = 0;
do
{
readbytes = fs.Read(buffer, 0, 1024);
wf.Write(buffer, 0, 1024);
}
while (readbytes <= 0);
}
cuike519 2009-11-23
  • 打赏
  • 举报
回复
File.Copy最终调用的是Win32的CopyFile方法,想检测copy到哪个字节基本上比较困难。

如果是目录Copy可以使用BackgroundWorker来异步检测Copy到哪个文件。如果是想检测Copy文件的具体内容恐怕要自己写Copy方法,下面两个方法供楼主参考。

1、做个假的ProgressBar使用Timer来控制,当Copy某个文件的时候,这个bar不停的在闪烁(见过VB的安装程序吧,有一个条子就这样)。
2、自己实现文件Copy方法,按字节块复制,每次复制一个字节块发送一个消息通知(需要一个委托)客户端复制了一个块,你大概需要一个OnCopy的方法来触发CopyHander事件。
noway8881 2009-11-23
  • 打赏
  • 举报
回复
貌似没办法,只有Vista及Windows7的拷贝是真正的进度拷贝。

Vista以下的系统你只能做到计算文件个数的进度。做不到大小的copy吧。
ztenv 2009-11-23
  • 打赏
  • 举报
回复
或把源文件等分为100份,然后再复制,复制完一个大小后,进度加一,
ztenv 2009-11-23
  • 打赏
  • 举报
回复
假如你每次读取1MB的数据到目标文件,那么就按1MB把源文件的大小分割,这样每写到目标文件一次,进度就加1,直到写满目标文件为止;
LutzMark 2009-11-23
  • 打赏
  • 举报
回复
根据文件大小算总的所需时间
然后UI交互可以用BackgroundWorker异步来ReportProgress控制进度条的进度
@井九 2009-11-23
  • 打赏
  • 举报
回复
笨点的方法,用FileWatcher读取复制的目标文件大小

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧