我有一个winforms应用程序,可以加载excel文件进行分析。目前,为了打开excel文件,文件必须不能在excel中打开,否则当我尝试加载文件时会抛出FileIOException。
我想要做的是允许我的应用程序读取文件,即使它是在excel中打开而不是强制用户首先关闭工作表。请注意,有问题的应用程序只需要读取文件,而不是写入文件。
这可能吗?
答案 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)
尝试复制已打开的文件,阅读并丢弃。为了检查文件是否已经打开,请尝试通过复制,读取,丢弃来阅读和处理异常。