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