C# 处理FileSystemWatcher.Created事件时发生文件读取错误

C# 处理FileSystemWatcher.Created事件时发生文件读取错误,c#,filesystemwatcher,C#,Filesystemwatcher,文件是通过FTP上传的,文件被占用是IO异常 var watcher = new FileSystemWatcher(); watcher.Created += (sender, e) => { var lines = File.ReadAllLines(e.FullPath, Encoding.UTF8); //io exception here }; 等待您的答案,非常感谢。您可以使用while和try catchblock。将文件读取代码放入中,同时循环,直到您成功读取文件

文件是通过FTP上传的,文件被占用是IO异常

var watcher = new FileSystemWatcher();
watcher.Created += (sender, e) =>
{
    var lines = File.ReadAllLines(e.FullPath, Encoding.UTF8); //io exception here
};

等待您的答案,非常感谢。

您可以使用
while
try catch
block。将文件读取代码放入
中,同时
循环,直到您成功读取文件为止(这意味着您成功通过了
try
块)。或者使用一些延迟,如评论中建议的(但这并不保证不会发生异常)


您将在两种情况下退出:文件成功读取或引发IO以外的异常。这意味着您需要更复杂的
catch
零件。您可以通过以下内容了解更多细节:)

只需添加一个小延迟,如:

var watcher = new FileSystemWatcher();
watcher.Created += (sender, e) =>
{
    Thread.Sleep(10);
    var lines = File.ReadAllLines(e.FullPath, Encoding.UTF8); //io exception here
};

由于您提到文件很大,您可以按照下面发布的代码进行操作

尝试在创建的事件中读取文件之前添加一个小延迟。就像50/100毫秒一样,问题是文件不存在,任何大小合适的文件都需要超过0毫秒才能到达。问题在于你不能很容易地判断上传何时完成。文件越大,需要的时间就越长。在unix上更容易,因为文件会随着ftp的到来而增长,您可以监视文件的大小,而当文件仍在变化时,就不用管它了。。但是windows倾向于分配和填充。创建文件时检查文件是否已锁定如何?如果文件已锁定,请等待一段时间,然后重试。通过这种方式,您可以实现下载大文件。静态bool IsFileLocked(FileInfo文件){FileStream stream=null;尝试{stream=file.Open(FileMode.Open,FileAccess.ReadWrite,FileShare.None);}catch(IOException){return true;}最后{if(stream!=null)stream.Close();}return false;}是的,小文件可以工作,但是超过100MB的文件会引发相同的异常……可能使用while并尝试catch和Thread。Sleep是正确的解决方案。。。