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

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

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

这可能吗?

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

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

你打算怎么打开文件?

如果你想打开它来读/写,那么你会得到exception。 如果您试图打开它只读,那么你应该没问题。

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

这只有在Excel打开FileShare.Read文件设置为允许其他应用程序(即你的)访问文件时才有效。 如果没有设置,则Excel将打开具有独占访问权限的文件。 注:我不认为这是事实,因为你可以打开一个Excel文件(在Excel中)阅读,如果其他人已经打开编辑。

更新 – 确定我没有正确地testing这个,直到darin的评论。 您需要FileShare.ReadWrite标志,尽pipe帮助指示它是为后续的文件打开器。 甚至没有FileShare.Read足够好,我觉得更奇怪。

SpreadsheetGear for .NET可以在Excel打开工作簿时读取工作簿。 下面是我们使用的代码(请注意,我们在打开后locking整个文件,以防止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

尝试制作已打开的文件的副本,读取并丢弃它。 为了检查文件是否已被打开,请尝试通过复制,读取,放弃来读取和处理exception。