我正在尝试使用 StreamReader 读取文件,但它始终被另一个进程使用,所以我收到此错误:
该进程无法访问文件 '\arfjwknasgmed17\C$\FLAG CONDITION\CP-ARFJN-FLAG.XLS',因为它正被另一个进程使用。
有没有办法可以在不复制的情况下阅读它?还是这是我唯一的选择?
我正在尝试使用 StreamReader 读取文件,但它始终被另一个进程使用,所以我收到此错误:
该进程无法访问文件 '\arfjwknasgmed17\C$\FLAG CONDITION\CP-ARFJN-FLAG.XLS',因为它正被另一个进程使用。
有没有办法可以在不复制的情况下阅读它?还是这是我唯一的选择?
仅当打开文件的程序首先指定对该文件的读取共享权限时,您才能读取该文件。
如果该文件确实没有读取共享权限,那么您将无法首先复制它。
如果您指定的共享权限与已打开文件的程序的共享权限冲突,您可能无法访问该文件。例如,如果已经打开它的程序没有授予写访问权限,则您不能授予写访问权限。
如果首先打开文件的程序支持卷影复制 (VSS),您还可以使用 VSS 来访问该文件。
有一些商业软件驱动程序允许您访问这些文件,即使它们正在使用中。您过去可以使用 St-Bernards 的 Open File Manager,也可以使用VisionWorks Solutions Inc. 的File Access Manager (FAM)。这些驱动程序通常是 OEM 用于备份软件公司以包含在他们的产品中。
VSS 通过告诉已经打开文件的程序另一个程序想要从文件中读取来工作。VSS 然后复制该文件并让您从该副本中读取。VSS 不适用于旧版应用程序。
FAM 通过指定可以访问独占打开和锁定文件的应用程序的“允许列表”,透明地适用于旧版和非旧版程序。仅允许此列表中的程序访问这些文件。当一个文件被打开时,它会进入缓存模式,这样您就可以获得文件的副本,就像文件的“备份/打开”开始时一样。此时,最初打开文件的程序会看到文件的实际状态,而允许列表中的第二个程序会看到文件的“打开/备份”发生时的文件。这确保了文件的一致性。
试试下面的代码。
FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
fileStream = new StreamReader(fileStr);
我已经在 Windows XP 上试过了。如果文件已经被其他进程以写入模式打开并且它没有指定共享权限,您仍然可以以读取模式打开文件。
免责声明:它有效,但是,我不确定您是否应该在生产代码中使用它。我还没有找到任何说它应该工作的正式文件。