我可以简单地“读取”正在使用的文件吗?

时间:2008-10-15 06:01:23

标签: c# file file-io filesystems file-permissions

我正在尝试使用StreamReader来读取文件,但是它总是被另一个进程使用,所以我收到了这个错误:

  

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

有没有一种方法可以在不复制的情况下阅读本文?或者这是我唯一的选择?

2 个答案:

答案 0 :(得分:25)

只有首先打开文件的程序指定了该文件的读取共享权限,才能读取该文件。

如果文件确实没有读取共享权限,则您将无法在第一时间复制它。

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

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

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

VSS的工作原理是告诉程序已经打开了另一个程序要从文件中读取的文件。然后,VSS会复制该文件,并允许您从该副本中读取。 VSS不适用于遗留应用程序。

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

答案 1 :(得分:2)

尝试以下代码。

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

我在Windows XP上尝试过它。如果该文件已被某些其他进程以写入模式打开&amp;它没有指定共享权限,您仍然可以在读取模式下打开文件。

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