以下是我用来关闭应用程序及其关联进程以及删除在使用应用程序期间提取的所有文件的代码:
private void Quit_Click(object sender, RoutedEventArgs e) //close the application
{
//kill cinector after all import is done
Process[] processes = Process.GetProcesses();
for (int i = 0; i < processes.Count(); i++)
{
if (processes[i].ProcessName.ToLower().Contains("CinectorProcess"))
{
processes[i].Kill();
}
}
//also kill powerpoint just in case
for (int i = 0; i < processes.Count(); i++)
{
if (processes[i].ProcessName.ToLower().Contains("powerpnt"))
{
processes[i].Kill();
}
}
//kill the engine
ShutdownEngine();
//kill the main app
App.Current.Shutdown();
//also delete all three folders
//slides_png_prev
if (Directory.Exists(slides_png_prev))
{
Thumbnails = null;
Directory.Delete(slides_png_prev, true);
}
//slides_png
if (Directory.Exists(slides_png))
{
Directory.Delete(slides_png, true);
}
//slides_png_prev_seleect
if (Directory.Exists(slides_png_prev_seleect))
{
Directory.Delete(slides_png_prev_seleect, true);
}
}
然而,问题是当它试图删除文件(这是应用程序中某处使用的图像)时,它会显示以下异常:
&#34;该进程无法访问该文件,因为该文件正由另一个进程使用。&#34;
更新:
我发现这个过程&#39; Mastersolution.vhost.exe&#39;正在保存我尝试删除的所有文件。 Mastersolution实际上是我在线App.Current.Shutdown();
关闭的主要应用程序所以我需要在删除它们之前以某种方式断开主应用程序中的文件。但是要这样做吗?
答案 0 :(得分:3)
首先,您应该确定文件夹中的哪个文件被锁定 - 而不是删除整个文件夹,删除单个文件。 然后使用Process Explorer和Ctrl + F检查哪个进程真正使用了不可删除文件。
此外,您可以在此代码中使用方法WhoIsLocking
。
https://bitbucket.org/snippets/wiip/nnGX
您可以使用它来确定哪个进程锁定文件。然后你可以写这样的东西来自动终止这个过程:
List<Process> lp = FileUtil.WhoIsLocking(fileName);
foreach (Process p in lp)
{
p.Kill();
}
当没有更好的选项时,这是最后一种解决方法,例如关闭应用中的文件,使用自动化功能关闭Powerpoint等。
答案 1 :(得分:3)
将文件存储在临时目录中,让操作系统处理它。
答案 2 :(得分:0)
您可以删除没有问题的文件夹,前提是它们未被使用且您有权这样做。 您可以使用SysInternals Handle来确定哪些进程正在访问您想要的文件/文件夹。请注意,如果您无法删除这些文件,并且您的进程不是访问它们,则只需发出警告:“无法清理文件夹:幻灯片预览”而不是随机删除用户应用程序,直到您可以删除png。
旁注:提醒我不要使用可以杀死办公室的应用程序并放弃我已完成的任何工作。
您应该使用您启动或更好的每个进程的pid,使用IPC发送友好的关闭请求,该请求可以在关闭之前清理资源。对于powerpoint,这很简单,就像在应用程序对象上调用Quit()
一样。