好的,这就是问题,我使用连接(连接....等等等等)然后在我的使用块结束后我想启动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'”
答案 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事件被触发时,我认为打开文件是安全的。但是,进一步检查文件是否已被其他进程再次锁定,仍然值得做。