日期:2014-05-18  浏览次数:20761 次

C# 文件监听
目前在开发一个项目内容
1.有一台设备 照相功能 
2.生成图片放入 电脑 如:D:\test中

使用fileSystemWatcher监听 当图片CREATE 的时候 拿取图片到数据库
程序出现一个问题

设备软件占用图片。而我的监听系统也要获得图片  
就会报 错误 D:\TEST\**.Jpeg 文件被另一个通道占用。

这种事情应如何出来???
请各位指教

!!

------解决方案--------------------
FileSystemWatcher是不会占用文件的。看看是不是其他的什么东西占用了。
------解决方案--------------------
那就取消占用吧,或者双方已共享模式打开文件,不能写只能读
------解决方案--------------------
先Sleep一秒或者更长,等照相软件写完数据再读取图片
------解决方案--------------------
第一次正常 ,第二次被占用,说明你第一次使用后 没有释放它
------解决方案--------------------
我用过filesystemwatch,很好用,假设你要判断文件是否已经完全写入完毕,那你只能用ioexception,也就是尝试去读,如果用try catch发现io异常 让线程sleep1秒 继续去尝试,直到成功为止。当然 你如果 用了一些资源未释放那就。。。养成习惯。像filestream 等 都是要自己释放对象的
C# code
  //当发现有文件创建时候,判断是否文件存在,以及文件是否已经完全写入完毕
        private static void BeforeDoWork(string path)
        {
            FileInfo fi = new FileInfo(path);
            string msg = string.Empty;
            //判断文件是否存在(因为可能是文件夹或者别的什么异常)
            if (!fi.Exists)
            {
                msg += path + " 文件不存在或者不是文件"+DateTime.Now;
                lock (_locker)
                {
                    writeInLog(msg);
                }
                SendMessage(msg);
                return;
            }
            //这里采用IO冲突的方式去判断是否写入完毕
          Again:  try
            {
                fi.OpenRead();
            }
            catch (IOException ex)
            {
                Thread.Sleep(500);
                goto Again;
            }
        }