我有一个创建excel文件的C#应用程序。但是如果文件保持打开并且应用程序第二次运行,则会抛出IO异常(因为,在代码中我用新的文件替换现有文件) 现在,我想检查文件是否已打开并终止引用此文件的excel.exe进程。 有什么办法可以实现吗?
注意:可能有多个Excel文件已打开。我想只关闭正在使用我的文件的进程。
xlFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
File.Copy(xlFilePath + "\\file.xlsx", String.Format("{0}\\OutputFile{1}.{2}.xlsx", xlFilePath, DateTime.Now.Year, DateTime.Now.Month), true);
xlFilePath = Path.Combine(xlFilePath, String.Format("{0}\\OutputFile{1}.{2}.xlsx", xlFilePath, DateTime.Now.Year, DateTime.Now.Month));
appl = new Excel.Application(Visible = false);
wbookss = appl.Workbooks;
wbook = wbookss.Open(xlFilePath);
//Excel.Worksheets wsheetss = appl.Worksheets;
wsheet = wbook.Sheets["Sheet1"];
Application_GenerateReport(wsheet);
Clipboard.Clear();
wbook.Close(true);
wbookss.Close();
appl.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wsheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbookss);
System.Runtime.InteropServices.Marshal.ReleaseComObject(appl);
编辑:如果上次运行中有异常,文件将保持打开状态。如果用户打开它,可以通过检查MainWindowTitle属性(正如Yeldar建议的那样)来杀死它。
答案 0 :(得分:1)
由于Excel将打开文件的名称存储在其标题中,如下所示:
Microsoft Excel - filename.xls
您可以遍历这些进程并终止具有给定名称的进程:
string filename = "mylist.xls";
var excelProcesses = Process.GetProcessesByName("excel");
foreach (var process in excelProcesses)
{
if (process.MainWindowTitle == $"Microsoft Excel - {filename}") // String.Format for pre-C# 6.0
{
process.Kill();
}
}
请注意:
然而,正如我在评论中所说,最好修复原因,但不是后果 - 只需让程序启动新的Excel应用程序而不会出错。
答案 1 :(得分:1)
另一种解决方案可能是:
taskkill
此行将调用命令提示符并运行命令System.Diagnostics.Process.Start("CMD.exe","taskkill /FI "WindowTitle eq Microsoft Excel - filename.xls");
。
所有开放的excel程序都将以这种方式被杀死。
更新:(对于一个文件)
gdb ./Debug/TestC++.exe ./TestC++.exe.stackdump