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% 能判断文件已经写入完毕 间隔时间可以适当设置长一些