操作文件时,如何确定文件已经准备好了

色郎中 2017-04-15 12:43:32
监控指定文件夹,当有新文件产生时,将文件名入列,,
监控线程中,从队列中取文件名,并对文件操作

现在发现一个问题,,不停的向 指定文件夹上传文件时,监控文件夹线程产生2个事件:create 和 modified,根据这两个事件,将文件名入列,后续的处理线程好像都没有问题;

但是,当文件比较大时,监控文件夹线程产生3个事件:create 和2次 modified,这里就感觉不好处理了

如果在 create事件时,且文件不大时,将文件名入列, 后续处理线程处理文件没啥问题,,但是当文件比较大时,就不行了

如果在modified事件时,入列,同样,小文件基本没问题,,但是大文件产生两次modified,也难处理了

现在想,都在create时,入列, 处理时,怎么判断文件复制完了? 判断文件是否可以打开,这样好像不合适





...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2017-04-16
  • 打赏
  • 举报
回复
可以在写文件的时候,使用临时文件, 只有文件数据完整后, 将文件名更改为正式的名称。 这个时候读线程看到的就一定是完整的文件
色郎中 2017-04-15
  • 打赏
  • 举报
回复
这样合适吗 比如一次复制100个文件来,其中有1个大文件, 100个文件名都入列了;处理线程从队列取文件名,并操作,当,某个文件操作异常(没有复制完成,操作应该会有异常),将其重新加入队列尾部,
threenewbee 2017-04-15
  • 打赏
  • 举报
回复
准备好本身没有一个定义。你可以用进程通讯的方式,让你产生文件的进程报告它文件是否准备好
  • 打赏
  • 举报
回复
引用 1 楼 wanyeye 的回复:
这样合适吗 比如一次复制100个文件来,其中有1个大文件, 100个文件名都入列了;处理线程从队列取文件名,并操作,当,某个文件操作异常(没有复制完成,操作应该会有异常),将其重新加入队列尾部,
操作任何文件都有可能抛出异常,这不像是读写进程自己的局部变量那么可以保证不异常。 实际上要怎样处理,只有跟用户协商,合适不合适并不是技术问题,在明确了需求不断变化之后、设计程序才是技术问题。比如说你可以等待1分钟再操作,这“合适吗”?只有用户知道。
  • 打赏
  • 举报
回复
翻来覆去纠结”入列“这个词儿干什么呢?整个描述,只是说“这里就感觉不好处理了”和“也难处理了”,对问题根本不分析不调试,就是梦一样猜东西猜代码,纠结这些意义不大。
  • 打赏
  • 举报
回复
在modified事件时,判断文件能否以独占方式打开,如果可以就入列
xuzuning 2017-04-15
  • 打赏
  • 举报
回复
尝试以独占方式(FileShare.None)打开文件

110,571

社区成员

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

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

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