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

Rak*_*h K 7 c#

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

谢谢,拉克什.

Han*_*ant 8

这是可能的,但您必须小心控制您指定的文件共享.大多数.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...
        }
Run Code Online (Sandbox Code Playgroud)

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

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


Nay*_*yan 8

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

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

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

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

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

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

  • 我发现FileShare.Read不起作用,而FileShare.ReadWrite则没有 (2认同)