【问题标题】:How do I open a file that is opened in another application如何打开在另一个应用程序中打开的文件
【发布时间】:2009-06-26 09:34:01
【问题描述】:

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

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

这可能吗?

【问题讨论】:

    标签: c# excel file-io


    【解决方案1】:

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

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

    【讨论】:

    • 我认为 FileShare 标志适用于另一种情况 - 当您希望允许其他应用程序访问文件时
    • 这来自元数据:“包含用于控制其他 System.IO.FileStream 对象对同一文件的访问类型的常量”
    • 对于未来的开启者来说,FileShare.Read 意味着“未来的开启者可以打开文件进行阅读”。对于过去的开启者,FileShare.Read 的意思是“只有当它有过去的开启者以只读方式打开它时才为我打开这个文件”。这就是为什么这里需要使用 FileShare.ReadWrite,因为 Excel 会打开文件进行写入。
    【解决方案2】:

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

    如果您尝试打开它以进行读/写,那么您会遇到异常。如果您尝试以只读方式打开它,那么您应该没问题。

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

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

    更新 - 好的,直到 darin 的 cmets 之后我才正确测试这个。您需要 FileShare.ReadWrite 标志,尽管帮助表明它是用于后续文件打开器的。甚至FileShare.Read 都不够好,我觉得更奇怪。

    【讨论】:

    • 这是不正确的。使用 FileShare.Read 意味着:“只有在任何先前的打开者已经打开它以供读取时,才为我打开此文件。”事实并非如此,因为 Excel 打开它是为了写作。
    • @darin - 我没有使用 FileShare。
    • 好答案。确实,Excel文件不是以独占方式打开的,所以这种方法是完全可以的。
    • File.Open 在幕后使用它,FileShare.None 不起作用。
    【解决方案3】:

    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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多