在打开或启动excel文件之前,请检查它是否可用

时间:2009-06-09 13:26:21

标签: c# excel file

好的,这就是问题,我使用连接(连接....等等等等)然后在我的使用块结束后我想启动excel应用程序,如下所示:System.Diagnostics.Process.Start( excelFile);

这有效...有时,有时,我的计算机运行得太快,在文件完全关闭之前,或连接完全终止,或类似的事情,上述语句被打开,excel打开并说它无法访问文件。

这种情况会打开和关闭,如果我暂停它,它会更频繁地工作,但我需要一种方法来检查我是否能够在访问之前访问该文件。

这不会抛出异常,因此捕获异常不是一个选项

我试过了:

connection.Close();
connection.Dispose();
GC.Collect();

其中没有人工作过。

我知道任何检查都会有可能返回该文件可用,然后在打开的状态可以说明某人正在使用的文件之前,那很好。只需要一种方法来检查。

好的我试过了:

Microsoft.Office.Interop.Excel.Application _app =
                          new Microsoft.Office.Interop.Excel.Application();

        try
        {
            Workbook wbook = _app.Workbooks.Open(excelFile,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        }
        catch (COMException ex)
        {
            //The file can't be opened in Excel
        }
        finally
        {
            //close the workbook and release the resources (GC.Collect() et al as usual)
            _app.Workbooks.Close();
            GC.Collect();

        }
        System.Diagnostics.Process.Start(excelFile);

然后我通过捕获异常然后继续执行start命令,其中excel告诉我“无法访问'fileName'”

5 个答案:

答案 0 :(得分:4)

尝试此功能检查文件是否仍处于打开状态:

public bool IsFileOpen(string path)
{
    FileStream fs = null;
    try
    {
        fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
        return false;
    }
    catch(IOException ex)
    {
        return true;
    }
    finally
    {
        if (fs != null)
            fs.Close();
    }
}

答案 1 :(得分:0)

我假设,当您写入文件时,您可以非常轻松地获得其文件大小。你试过比较这两个吗?

while (fileSize != new FileInfo(excelFile).Length) {
    Thread.Sleep(1000);
}
System.Diagnostics.Process.Start(excelFile);

如果文件写得不正确,您可能需要放入计数器,以免永远睡不着。不确定这是否有用,但我想这值得一试。

答案 2 :(得分:0)

查看文件在Excel中打开是否有效的选项是使用Primary Interop Assemblies

Microsoft.Office.Interop.Excel.Application _app = 
                              new Microsoft.Office.Interop.Excel.Application();

try {
    Workbook wbook = _app.Workbooks.Open(excelFile,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing);
} catch (COMException ex) {
    //The file can't be opened in Excel
} finally {
    //close the workbook and release the resources (GC.Collect() et al as usual)
}

//The file can be opened in Excel if there wasn't a caught exception.
//You can wrap the above in a loop to test more than once as per the other answer

但无论如何,找到一种将写作与阅读同步的好方法仍然会更好。也许如果你与写作部分共享代码,你可以得到更好的建议。

答案 3 :(得分:0)

解决方案1: 你可以试试

File.Move(sourceFilename, destinationFilename) 

表示您要打开的文件。 如果没有异常,只需将文件移回原始源。

此解决方案的一个缺点是,如果文件被任何其他进程读取,它也会抛出异常。

解决方案2:

    FileStream stream = File.OpenWrite("yourfilename");
    stream.Close();

这应该只检查文件是否可写。

使用这些解决方案,您不必向Excel添加依赖项,它适用于每种文件类型。

答案 4 :(得分:0)

您可以使用FileSystemWatcher类来订阅文件系统事件,包括文件更改。

当Changed事件被触发时,我认为打开文件是安全的。但是,进一步检查文件是否已被其他进程再次锁定,仍然值得做。