如何打开在另一个应用程序中打开的文件

时间:2009-06-26 09:34:01

标签: c# excel file-io

我有一个winforms应用程序,可以加载excel文件进​​行分析。目前,为了打开excel文件,文件必须不能在excel中打开,否则当我尝试加载文件时会抛出FileIOException。

我想要做的是允许我的应用程序读取文件,即使它是在excel中打开而不是强制用户首先关闭工作表。请注意,有问题的应用程序只需要读取文件,而不是写入文件。

这可能吗?

4 个答案:

答案 0 :(得分:29)

打开文件时,您可以尝试传递FileShare.ReadWrite:

using (var stream = new FileStream(
       @"d:\myfile.xls", 
       FileMode.Open, 
       FileAccess.Read, 
       FileShare.ReadWrite))
{

}

答案 1 :(得分:6)

您是如何尝试打开文件的?

如果您尝试打开它进行读/写,那么您将获得异常。如果你试图打开它只读,那么你应该没问题。

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

这仅在Excel打开文件时才有效,FileShare.Read设置为允许其他应用程序(即您的)访问该文件。如果未设置此项,则Excel将以独占访问权限打开该文件。注意:我不认为是这种情况,因为如果有其他人打开它进行编辑,您可以打开Excel文件(在Excel中)进行阅读。

更新 - 好的,直到darin评论之后我才对此进行了正确的测试。尽管有帮助表明它是后续文件开启者,但您需要FileShare.ReadWrite标志。甚至FileShare.Read都不够好,我发现甚至更奇怪。

答案 2 :(得分:1)

SpreadsheetGear for .NET可以在Excel打开工作簿时阅读工作簿。以下是我们用来执行此操作的代码(请注意,我们在打开后锁定整个文件,以便在我们处于阅读过程中时保留Excel或任何其他应用程序):

stream = new System.IO.FileStream(path,
    System.IO.FileMode.Open,
    System.IO.FileAccess.Read,
    System.IO.FileShare.ReadWrite,
    SG.CompoundDocumentIO.Storage.OpenBufferLength);
try
{
    stream.Lock(0, stream.Length);
}
catch
{
    // .NET 1.1 requires cast to IDisposable
    ((IDisposable)stream).Dispose();
    throw;
}

免责声明:我拥有SpreadsheetGear LLC

答案 3 :(得分:0)

尝试复制已打开的文件,阅读并丢弃。为了检查文件是否已经打开,请尝试通过复制,读取,丢弃来阅读和处理异常。