如何以编程方式删除文件
本文关键字:删除 文件 方式 编程 | 更新日期: 2023-09-27 18:10:44
下面是我用来关闭应用程序及其相关进程并删除在使用应用程序期间提取的所有文件的代码:
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);
}
}
然而,问题是,当它试图删除文件(这是在应用程序的某个地方使用的图像)它显示以下例外:
"该进程不能访问该文件,因为它正在被另一个进程使用。"
更新:我发现进程"Mastersolution.vhost.exe"包含了我试图删除的所有文件。Mastersolution实际上是我在App.Current.Shutdown();
线上关闭的主要应用程序,所以我需要在删除它们之前以某种方式将文件从主要应用程序断开。但是怎么做呢?
将文件存储在临时目录中,并让操作系统处理它。
看到路径。GetTempPath和Path.GetTempFileName。
首先,您应该确定文件夹中的哪个文件被锁定-而不是删除整个文件夹,删除单个文件。然后用进程资源管理器和Ctrl+F检查哪个进程真正使用了不可删除文件。
您也可以在此代码中使用WhoIsLocking
方法。
您可以使用它来确定哪个进程锁定了文件。然后你可以这样写来自动终止这个进程:
List<Process> lp = FileUtil.WhoIsLocking(fileName);
foreach (Process p in lp)
{
p.Kill();
}
这是在没有更好的选择时的最后一个解决方案,如关闭应用程序中的文件,使用自动化关闭Powerpoint等。
您可以这样删除文件夹,只要它们没有被使用并且您有这样做的权限。您可以使用SysInternals Handle来确定哪些进程正在访问您想要的文件/文件夹。请注意,如果你不能删除文件,这不是你的进程访问它们,只是提出一个警告:"Could not clean up folder: Slide Previews"而不是随机杀死用户的应用程序,直到你可以删除png。
附带说明:提醒我不要使用一个会破坏办公室的应用程序,并使我所做的工作付之东流。
你应该使用你启动的每个进程的pid,或者更好的是,使用IPC发送一个友好的关闭请求,可以在关闭之前清理资源。对于powerpoint,这很简单,只需在应用程序对象上调用Quit()
即可。