14

我正在尝试使用 StreamReader 读取文件,但它始终被另一个进程使用,所以我收到此错误:

该进程无法访问文件 '\arfjwknasgmed17\C$\FLAG CONDITION\CP-ARFJN-FLAG.XLS',因为它正被另一个进程使用。

有没有办法可以在不复制的情况下阅读它?还是这是我唯一的选择?

4

2 回答 2

25

仅当打开文件的程序首先指定对该文件的读取共享权限时,您才能读取该文件。

如果该文件确实没有读取共享权限,那么您将无法首先复制它。

如果您指定的共享权限与已打开文件的程序的共享权限冲突,您可能无法访问该文件。例如,如果已经打开它的程序没有授予写访问权限,则您不能授予写访问权限。

如果首先打开文件的程序支持卷影复制 (VSS),您还可以使用 VSS 来访问该文件。

有一些商业软件驱动程序允许您访问这些文件,即使它们正在使用中。您过去可以使用 St-Bernards 的 Open File Manager,也可以使用VisionWorks Solutions Inc. 的File Access Manager (FAM)。这些驱动程序通常是 OEM 用于备份软件公司以包含在他们的产品中。

VSS 通过告诉已经打开文件的程序另一个程序想要从文件中读取来工作。VSS 然后复制该文件并让您从该副本中读取。VSS 不适用于旧版应用程序。

FAM 通过指定可以访问独占打开和锁定文件的应用程序的“允许列表”,透明地适用于旧版和非旧版程序。仅允许此列表中的程序访问这些文件。当一个文件被打开时,它会进入缓存模式,这样您就可以获得文件的副本,就像文件的“备份/打开”开始时一样。此时,最初打开文件的程序会看到文件的实际状态,而允许列表中的第二个程序会看到文件的“打开/备份”发生时的文件。这确保了文件的一致性。

于 2008-10-15T06:06:41.907 回答
2

试试下面的代码。

FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
fileStream = new StreamReader(fileStr);

我已经在 Windows XP 上试过了。如果文件已经被其他进程以写入模式打开并且它没有指定共享权限,您仍然可以以读取模式打开文件。

免责声明:它有效,但是,我不确定您是否应该在生产代码中使用它。我还没有找到任何说它应该工作的正式文件。

于 2012-02-03T04:57:49.783 回答