如何判断文件夹是否已经复制完成本帖最后由 cancancam 于 2012-11-18 20:53:52 编辑譬如共享了一个文件夹,
如何判断文件夹是否已经复制完成
本帖最后由 cancancam 于 2012-11-18 20:53:52 编辑 譬如共享了一个文件夹,别人可以通过samba把文件或文件夹存放到该文件夹中。C#可以用FileSystemWatcher来监视是否有新文件或文件夹存入到该文件夹中,但是如果遇到大文件或文件夹的时候,应该用什么办法可以判断这个文件或文件夹是否已经完成复制呢??
感谢大家!
[最优解释]
这个毛招可以用下,这种情况下很难做到完美判断,如果是局域网或者网络比较顺畅的情况,连续几秒文件都无增长,基本可以确认文件传输完成或者终止了;另外还有个方向,一般文件在被其他用户使用的时候,你试图做出重命名或者删除等动作的时候,系统会提示你文件占用中,看看没有没有判断文件是否被占用的API可以调用;
一句话,暂时没找到完美方案,看你自己的需求和实际坏境,找个比较靠谱的方法,如果想要完全确保安全,就需要双方通信,对方负责完后,发送一个信息过来
[其他解释]没有办法知道“一个文件夹是否复制完”,这不是一个状态,就像我不能通过观察你的动作判断你的工作是否做完了一样。
[其他解释]试图以独占方式打开文件,如果失败说明有程序正在写,否则就是“复制完了”。
[其他解释]根据被复制的文件夹的大小和原文件的大小和来判断
不知道可以不?
[其他解释]感觉够呛 有许多文件都是先建立一个同等大小的文件然后再写内容 ISO文件什么 好像就是这样的
[其他解释]复制的时在里面放一个文件,并打开它(readWrite),复制万成后,delete
[其他解释]这个感觉可行,移动文件夹的话,你必须里面有文件在被使用,才会报出异常。。
[其他解释]9楼的意思好像是 在文件夹里放一个标示性的文件 比如 mark.txt 在用户对这个文件夹进行指定操作时 比如文件的 添加 修改 删除 将这个文件打开 或者将这个文件中写入一个值 用于标示 此文件夹正在被改变 以这个文件来起到一个 类似“同步锁”的功能 我大概是这么理解的 感觉似乎可行
[其他解释]楼主客气 这个文件不删除也可以 就存在于那个文件夹里 用作标示 有类似这种功能的软件貌似就是这样做的 SVN什么的 里面就会存放一个.svn的文件夹 具体用途不是很清楚 不过猜测应该是用作类似标示的用途 这个文件可以隐藏 只充当表示符号
[其他解释]先判断文件夹是否存在,在比较2个文件夹的大小
[其他解释]你自己序列化一个文件到你要操作的文件夹,保存一个状态信息。如果你复制的程序跑完了,你就在把文件夹的那个序列化的文件读取下状态不就知道是不是复制结束了吗
[其他解释]比如说 当一个用户开始向这个文件夹中复制文件的时候 就以独占的方式打开标示文件 然后开始复制文件 待文件全部复制完毕后 关闭标示文件。 这样 当另一个用户想知道是否有人正在对这个文件夹进行添加文件操作的时候 可以尝试以独占方式打开标示文件 如果无法打开 说明标示文件正在被另一个用户打开 也就是说 那个用户正在向这个文件夹中传输数据 这样 就可以判定是否有人在向这个文件夹中传输数据 以及是否传输完成了 不知我表达清楚了么
[其他解释]楼上说的打开文件,进行删除。如果是其他文件。你怎么确定那。那种抓 异常的方式不可行。
你其实可以做成安装文件那样。IDictiony文件缓存本地。
[其他解释]
执行完复制操作,返回一个消息?
[其他解释]
监视文件的修改时间行么
[其他解释]
复制文件的时候是会开启一个进程的吧,你可以监听那个进程或者线程什么时候结束。
[其他解释]
进程之间的通讯,就弄成进程之间的通讯架构吧!进程之间可以相互注册监听,有多种通讯手段。
一些学生,只会弄个数据库表,或者共享文件什么的,来对付着“支持”进程之间的通讯需求。这个有些不伦不类。
[其他解释]
你从网上下载东西的时候能知道你下载多少,一样的道理,复制的时候有一个速度,有时间,
[其他解释]
楼主用FileSystemWather来监视文件夹的Created的事件,所以肯定是在复制一开始就被触发了,这非常合理。
然后就可以从这个时间起,对这个新创建的文件夹,还用FileSystemWatcher监视其Changed事件,并在每次Changed事件发生后记录这个最新的时间。接下来就用一个Timer每隔一定的时间检查这个最后的Changed事件被触发的事件,设定一个时间阈值,比如一分钟。那么文件夹停止变化已经一段时间,就可以认为这个复制已经完成了。
[其他解释]
我们知道系统系统在copy完了一个会刷新UI,那么我们可以肯定的是系统消息里面应该就这东西存在,所以需要hook一下这部分内容,简单google 一下系统有个ICopyHook挂钩
[其他解释]
应该可以判断这个文件夹下是否有文件的增加,或是判断这个文件夹内容的大小是否在增加,如果在持续的增加肯定就是在占用!
[其他解释]
楼主是指一个用户USER,将B文件夹里的东西放到共享文件夹A中,USER自己不知道什么时候完成了复制过程是么?如果是这样似乎可以像WINDOWS那样,统计一下文件数量,然后单个文件检测是否完成,完成一个数量减1,直到0为止。
[其他解释]对于文件夹的话可以遍历文件夹中的文件,然后以独占方式打开文件;如果对方上传的就是一个空文件夹,可以给遍历文件夹这个方法加个超时,比如5分钟,5分钟后这个文件夹还是没有文件,那么就说明复制完了。
不过这种方式不是很完美
[其他解释]要移支文件前先记录在全局变量中,哪个路径下的文件正在移动,移完了在全局变量中把对应路径删掉不行吗?
[其他解释]你好,谢谢你的回复。文件是可以的,但是文件夹无法用该办法实现,因为有尝试过在一个回圈里面不断尝试Move这个文件夹,并catch IOException,但是如果文件夹里面有一个很大size的文件,这时,文件夹可以被Move,并且没有catch到任何exception。
[其他解释]嗯,理解,这真是一个难题`~
[其他解释]+1
[其他解释]确实是
[其他解释]你好,谢谢你的回复,有尝试检查文件夹的大小,在一个无限回圈里面不断尝试获取这个文件夹的大小监视是否有增长,但是如果文件夹里面有一个很大size的文件,30几秒这个文件夹都没有改变大小,所以无法确定.
------其他解决方案--------------------
谢谢你的回复,这个当遇到文件夹里面有大文件的时候就不可行了
[其他解释]谢谢你的回复,因为文件夹是共享给用户传文件的,无法要求用户给出“复制完成”的提示文件。
[其他解释]你好,这样的话,问题就变成,何时才delete这个文件了,也就是何时才解锁了。
[其他解释]文件夹就很容易了,直接判断下就行了,这个即便没复制完也会有文件夹的
[其他解释]不好意思,我比较笨,没想明白,放了标识文件,然后如何判断什么时候完成复制呢??
[其他解释]]
谢谢你的回复,能详细说明一下如何“直接判断下”吗??是有文件夹,而且还想要知道这个文件夹什么时候传送完。
[其他解释] 不知道哦,不过看楼主好客气的样子,对我也说声谢谢回复吧
[其他解释]因为用户是用samba的形式访问文件夹并直接copy文件夹的,所以无法获取原文件夹的大小,谢谢你的回复
[其他解释]谢谢你的回复,复制并不是由程序执行的,是由user通过samba的形式访问,直接从本地copy到共享文件夹中。
[其他解释]谢谢你的解答,可能我问题没有描述清楚,是这样的
1, A文件夹,以samba的形式共享,User 通过访问网络共享A文件夹
2, B文件夹,User需要放到A中的文件夹
现在程序用FileSystemWatcher监视A文件夹,当B被复制到A中时,B没有完成复制就触发了watcher的created事件,我想问的就是,如何判断B是否已经完成复制。复制的动作并不是由程序执行。
[其他解释]哈哈,谢谢回复`~
[其他解释]System.IO.File.Copy(@"E:\Movie\KKND.rmvb", @"E:\Movie\KKND2.rmvb");
int k =0;
[其他解释]从这里就改变路线吧。
[其他解释]该回复于2012-11-23 08:42:27被管理员删除
[其他解释]谢谢你的回复,可能是我表述能力有问题,大家都似乎没看懂我的意思,好像只有你懂了,再等等有没有别的解决方案,如果没有就把分散给大家吧,谢谢大家的意见~
[其他解释]路过,只是来学习的。。。。。。
[其他解释]谢谢回复,但是文件不是由程序复制,无法获取文件路径