我正在使用 .net 文件监视程序监视文件夹中的某些类型的文件(*.mbxml)。我正在使用 filewatcher 创建的事件。一旦创建的事件触发,我必须将此文件移动到另一个文件夹。这种方法的问题在于,一旦文件复制开始,就会触发创建的事件。因此,如果文件复制到正在监视的文件夹所需的时间过长,则移动文件的代码就会失败。我进行了搜索,在网上找到的唯一解决方案是将文件移动到 try-catch 块中并继续尝试,直到复制整个文件。我不喜欢这个解决方案,如果在整个文件完成复制后触发创建的事件或者有一个单独的事件,那就更好了。还有其他方法可以实现这一目标吗?
您可以通过继承 FileSystemWatcher 并触发您自己的 FileReader 事件来简化代码,如下所示:
public class CustomFileSystemWatcher : System.IO.FileSystemWatcher
{
public CustomFileSystemWatcher()
{
this.Created += new FileSystemEventHandler(CustomFileSystemWatcher_Created);
}
private void CustomFileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
ThreadPool.QueueUserWorkItem((n) => { WaitFileReady(e); });
}
private void WaitFileReady(FileSystemEventArgs e)
{
while (true)
{
try
{
using (FileStream fs = File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
//exit
break;
}
}
catch (Exception)
{
//wait if you like
Thread.Sleep(100);
}
}
OnFileReady(e);
}
public event FileSystemEventHandler FileReady;
protected virtual void OnFileReady(FileSystemEventArgs e)
{
if (this.EnableRaisingEvents && FileReady != null) FileReady(this, e);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)