2009-06-26 159 views
20

我有一个加载在excel文件中进行分析的winforms应用程序。目前,为了打开excel文件,文件不能在excel中打开,否则当我尝试加载文件时会抛出FileIOException异常。如何打开在另一个应用程序中打开的文件

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

这可能吗?

回答

26

你可以尝试通过FileShare.ReadWrite打开文件时:

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

} 
6

你如何打开文件?

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

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

如果Excel中打开了文件,FileShare.Read设置为允许其他应用程序(即你的)能够访问到文件中时才工作。如果未设置,则Excel将打开具有独占访问权限的文件。注意:我不认为这是事实,因为如果有人打开Excel文件(在Excel中)以供阅读,则可以进行编辑。

UPDATE - 好的,我在darin的评论后才正确地测试过这个。您需要FileShare.ReadWrite标志,尽管有帮助表明它是用于后续文件的开启者。甚至连FileShare.Read都不够好,我甚至觉得它很奇怪。

+0

这是不正确的。使用FileShare.Read意味着:“只有在任何先前的打开程序将其打开以便读取时才打开此文件。”事实并非如此,因为Excel打开了它的文字。 – 2009-06-26 09:43:25

+2

@darin - 我没有使用FileShare。 – ChrisF 2009-06-26 09:45:24

0

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

1

可以在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

相关问题