【问题标题】:How to read a file which is currently used, like Windows does when copying it?如何读取当前使用的文件,就像 Windows 在复制文件时所做的那样?
【发布时间】:2010-12-06 23:04:24
【问题描述】:

我的一个应用程序旨在读取(并且仅读取)可能正在使用的文件。

但是,当读取已经在 Microsoft Word 中打开的文件时,此应用程序会抛出 System.IO.IOException

该进程无法访问文件“”,因为它正被另一个进程使用。

用来读取文件的代码是:

using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete))
{
    // Do stuff here.
}

当然,由于文件已经被使用,所以这个异常是意料之中的。

现在,如果我要求操作系统将文件复制到新位置,然后读取它,它就可以了:

string tempFileName = Path.GetTempFileName();
File.Copy(fileName, tempFileName, true);
//                                         ↓ We read the newly created file.
using (Stream stream = new FileStream(tempFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete))
{
    // Do stuff here.
}

File.Copy 的魔力是什么,它允许读取应用程序已经使用的文件,尤其是如何使用这种魔力来读取文件而不制作临时副本?

【问题讨论】:

  • 您的代码对我来说很好用。您是否有可能在您的应用程序中指定 FileAccess.Write,即使它不在您上面的 sn-p 中?
  • 正如 Ciaran Keating 上面所说,您的原始代码对我有用。你在“// Do stuff here”中做什么。

标签: c# ioexception file-access


【解决方案1】:

很好的问题。看看这个,似乎建议使用 FileShare。ReadWrite 是关键,值得一试。

http://www.geekzilla.co.uk/viewD21B312F-242A-4038-9E9B-AE6AAB53DAE0.htm

【讨论】:

  • 阅读 cmets,似乎它在某些情况下有效,而在其他情况下无效。在我的例子中,如果文件已经被 Microsoft Word 打开,切换到FileShare.ReadWrite 并不能解决问题。
  • 这很烦人,这篇博文也暗示了同样的事情。 alexpinsker.blogspot.com/2005/03/… 它似乎确实是一个问题,它已经被读取,而不是后续读取(您的应用程序)。
  • 作为进一步的旁注,使用 File.Open 返回一个 FileStream,如下所示:aautar.digital-radiation.com/blog/?p=1292
【解决方案2】:

尝试从 FileStream 构造函数中删除 FileShare.ReadWrite | FileShare.Delete,或至少删除 FileShare.Delete。

【讨论】:

  • 这些标志指定允许有什么 other 文件流,而不是当时正在打开的文件流 - 因此指定这些标志使得锁需要一个 较弱一个,所以你的说法是错误的。
  • 可以,但您的共享模式必须与文件其他现有句柄的共享模式一致。什么是“一致的”对我来说有点不清楚。例如,虽然 Word 打开了一个文件,但我可以使用 Read|Write 共享模式打开它,但不只是单独读取或单独写入。
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 2012-03-13
  • 2016-09-12
  • 2019-08-07
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
相关资源
最近更新 更多