『QQ:1353814576』

FileSystemWatcher事件OnCreated监测文件时如何判断文件是否创建完毕


FileSystemWatcher事件OnCreated监测文件时如何判断文件是否创建完毕

上次开发的一个客户端pdf转存程序 最近又在反馈问题 扰我操碎了心,问题原因大概是c#采取FileSystemWatcher 的OnCreated事件监听到文件时只知道有新文件创建了 但不知道pdf文件什么时候写入完毕,导致在转存文件时经常出现文件被占用导致失败的情况,原本是设计了固定时间延迟来作为文件是否书写完毕的判断依据,但由于业务需求无法延迟太长时间 时不时还是会出类似情况 所以最终采用了文件大小间隔时间判断的方式来判断

大概逻辑就是 收到创建时间后 对文件大小进行定时读取每次对比本次和上一次的文件大小。如果二者没有变化就逻辑上代表写入完毕

代码如下:


        private void fileSystemWater_Created(object sender, System.IO.FileSystemEventArgs e)
        {
            string path = e.FullPath;
            WaitingEnd(path);

            ///逻辑上已经断定文件写入完毕
        }

        private void WaitingEnd(string path)
        {
            long size1 = 0;
            long size2=0;
            try
            {
               System.IO.FileInfo fi;
                fi = new System.IO.FileInfo(path);

                size2 = fi.Length;
                do
                {
                    size1 = size2;
                    System.Threading.Thread.Sleep(1000);
                    fi.Refresh();
                    size2 = fi.Length;
                } while (size1 < size2);
            }
            catch { }
        }

目前用着也不是100% 能判断文件已经写入完毕 间隔时间可以适当设置长一些