打开已打开的文件时出现exception

我正在使用C#构建一个应用程序,我必须打开一个CSV文件来从中读取数据。 当我尝试在C#中打开CSV文件时,我在Excel中打开该文件时出现exception。 例外情况表明该进程无法访问该文件,因为该文件已经打开。 即使在其他应用程序中打开文件,如何解决此问题并打开文件?

谢谢,拉克什。

一段时间后我遇到了这个问题。

您缺少FileShare参数。 如果不指定,如果打开文件,它将由您的应用程序专门锁定。 但由于它已经被Excel(或任何其他应用程序)打开,您将收到一个例外。

你可以尝试使用它 – 我认为这将是你最好的选择 –

using (FileStream fs = File.Open(, FileMode.Open, FileAccess.Read, FileShare.Read))

这段代码说:Hello Excel! 如果您可以允许(读取,不抛出exception),我想阅读该文件,但我不会尝试拥有它,我知道您可以随时修改它。

如果这引发错误,则Excel甚至拒绝您的读访问权限。 太糟糕了! 祝一切顺利。

这是可能的,但您必须小心控制您指定的文件共享。 大多数.NET类默认为FileShare.Read,拒绝写入文件的另一个进程。 但是,如果文件由Excel打开,那么它就无法工作,它已经获得了对它的写入权限。 你不能否认已经获得的权利。

要解决此问题,请使您的代码看起来类似于:

  using (var fs = new FileStream(@"c:\\temp\\test.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var sr = new StreamReader(fs)) { // Read it... } 

请注意FileShare.ReadWrite的使用。 我validation了此代码有效,而Excel已打开test.csv。

请注意您可能会遇到的麻烦,当您正在阅读文件时,Excel会写入文件时会发生奇怪的事情。 你可能会阅读垃圾,旧数据的一部分,新的一部分,没有一个很好的诊断方法。

由于并发问题,您无法选择写入同一文件的两个实例。 应该可以以只读方式打开它,这将允许不存在并发问题,因为读取保证是线程安全的。 本文应该解释如何做我提出的建议

那是不可能的。

可以使用不同类型的保护打开文件。 Excel将以独占方式打开文件,以防止文件被某些其他程序更改,然后在Excel保存时将其还原。

Excel可能已打开文件并允许读取,但随后您可能最终处于死锁状态,其中两个应用程序打开文件进行读取,并且两者都无法保存任何内容。

此答案建议的另一个解决方案是将文件复制到临时文件并打开它。

使用

 System.IO.File.Copy(sourcepath, copypath, false);