如何读取当前使用的文件,就像Windows复制时一样?

Ars*_*nko 8 c# file-access ioexception

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

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

该进程无法访问文件'<filename here>',因为它正由另一个进程使用.

用于读取文件的代码是:

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

当然,由于该文件已被使用,因此预计会出现此异常.

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

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.
}
Run Code Online (Sandbox Code Playgroud)

什么是魔术File.Copy允许读取应用程序已经使用的文件,特别是如何使用这个魔术来读取文件而不制作临时副本?

Tom*_*Tom 4

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

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