8

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

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

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

用于读取文件的代码是:

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,尤其是如何使用这种魔力来读取文件而不制作临时副本?

4

2 回答 2

4

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

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

于 2010-12-06T23:10:06.987 回答
0

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

于 2010-12-06T23:09:15.427 回答