【问题标题】:Reading a file without causing IOException on 3rd party program在第 3 方程序上读取文件而不导致 IOException
【发布时间】:2013-08-06 05:48:18
【问题描述】:

我正在读取一个第三方程序定期写入的文件。 我正在使用下面的 FileStream 阅读:

using (FileStream fs = new FileStream(
                         FullPath,
                         FileMode.Open,
                         FileAccess.Read,
                         FileShare.ReadWrite))

但是,第 3 方程序正在写入文件,但使用的是 FileShare.None

因此,当第 3 方程序尝试以独占访问权限打开文件但失败时,我偶尔会打开文件以供读取。

我怎样才能在不给第 3 方程序造成问题的情况下读取此文件? 我不介意发布我的阅读以优先考虑另一个应用程序。有什么办法吗?

【问题讨论】:

  • 您是否尝试将其复制到临时位置并从那里读取?通常,我所做的是创建一个函数,该函数尝试读取文件,如果它正在使用它返回 false,但如果不返回 true,那么我尝试将文件复制并移动到我可以使用它的位置。使用生产文件可能存在潜在危险,尤其是在混合使用 2 个进程的情况下。
  • File.Copy 只是在后台执行 FileStream。问题不在于我尝试阅读并将其锁定时。当我可以访问该文件并且第 3 方程序尝试获得独占访问但由于我打开它而无法访问时。
  • 如果您将文件复制到一个临时位置并让您的程序使用该临时文件,这样原始文件就不会被使用,因此仍然可以被第 3 方程序毫无问题地访问怎么办? .如果这是有道理的:D
  • “复制”功能只是打开文件,读取文件并将其写入新位置。本质上导致了同样的问题。
  • 好吧,鉴于他们写入文件的方式,我不确定您是否能够消除此问题。如果您无法消除问题,那么最好的办法就是尽可能减少其发生的机会。

标签: c# .net filestream ioexception read-write


【解决方案1】:

您要做的是监控进程创建通知,当您看到特定进程出现时,您会想要避开它。

IWbemServices::ExecNotificationQuery

这里有一些来自MSDN 的额外细节。 这里也是一个 CodeProject:Process Information and Notifications using WMI

【讨论】:

  • 不幸的是,另一个进程是一个服务,所以一直在运行。
【解决方案2】:

如果此第 3 方进程(.exe、Windows 服务、Web 应用程序等)停止,您可以在发生这种情况时访问该文件,如果它永远不会停止或无法判断它何时会运行,您可以这样做一打开服务器就复制这个文件。

这是否有效取决于您的应用和另一个应用的性质,以及您需要阅读此文件的频率。

【讨论】:

  • 也许该服务有一些公共方法,您可以从中获得与文件中​​相同的信息。
【解决方案3】:

虽然我没有使用它,但您是否尝试过使用System.IO.Filestream.Unlock 方法来帮助您流式传输当前未被其他软件锁定的文件部分?我只是假设其他软件没有锁定整个文件。

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2021-03-04
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多