【问题标题】:An file reading error occurred while handling FileSystemWatcher.Created event处理 FileSystemWatcher.Created 事件时发生文件读取错误
【发布时间】:2017-06-30 09:40:40
【问题描述】:

文件是通过 FTP 上传的,它会抛出一个文件被占用的 IO 异常

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

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

【问题讨论】:

  • 尝试在 Created 事件中读取文件之前添加一小段延迟。像 50/100 毫秒
  • 问题是文件不会立即存在,任何大小合适的文件都需要超过 0 毫秒才能到达。问题在于您无法轻松判断上传何时完成。文件越大,需要的时间就越长。在 unix 上它更容易,因为文件随着 ftp 的进入而增长,你可以监视大小,虽然它仍然发生变化,但不要管它。但是 windows 倾向于分配和填充。
  • 如果文件被锁定,那么在创建文件时检查文件是否被锁定,然后等待一段时间并重试。通过这种方式,您可以实现下载大文件。静态布尔 IsFileLocked(FileInfo 文件) { FileStream 流 = null;尝试 { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } 捕捉(IOException){ 返回真; } 最后 { if (stream != null) stream.Close(); } 返回假; }

标签: c# filesystemwatcher


【解决方案1】:

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

您将在两种情况下退出:文件读取成功或抛出 IO 以外的异常。这意味着您需要更复杂的catch 部分。您可以通过此了解更多详细信息:)

【讨论】:

    【解决方案2】:

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

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

    既然你提到文件很大,你可以按照下面SO Post发布的代码进行操作

    【讨论】:

    • 是的,小文件也可以,但是超过 100MB 的文件会抛出同样的异常......也许使用 while 和 try-catch 和 Thread.Sleep 是正确的解决方案......
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多