打开已打开的文件时出现异常

时间:2010-10-02 16:50:31

标签: c#

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

谢谢, 勒凯什。

5 个答案:

答案 0 :(得分:8)

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

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

您可以尝试使用此功能 - 我认为这是您最好的选择 -

using (FileStream fs = File.Open(<file-path>, FileMode.Open, FileAccess.Read, FileShare.Read))

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

如果这会引发错误,那么Excel甚至拒绝您进行读访问。那太糟糕了! 一切顺利。

答案 1 :(得分:7)

这是可能的,但您必须小心控制您指定的文件共享。大多数.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。我验证了此代码有效,而Excel已打开test.csv。

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

答案 2 :(得分:0)

由于并发问题,您无法选择写入同一文件的两个实例。应该可以以只读方式打开一个,这样就不会出现并发问题,因为读保证是线程安全的。 This article应该解释如何做我建议的事情

答案 3 :(得分:0)

那是不可能的。

可以使用不同类型的保护打开文件。 Excel专门打开文件,目的是保护文件不被其他程序更改,然后在Excel保存时恢复。

Excel可能已经打开文件并允许读取,但是你可能最终处于死锁情况,其中两个应用程序打开文件进行读取,并且都不能将任何内容保存回来。

答案 4 :(得分:0)

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

使用

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