【问题标题】:How to delete files programmatically?如何以编程方式删除文件?
【发布时间】:2019-01-03 13:53:02
【问题描述】:

这是我用来关闭我的应用程序及其相关进程并删除在应用程序使用过程中提取的所有文件的代码:

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(); 所以我需要在删除文件之前以某种方式断开文件与主应用程序的连接。但是要这样做吗?

【问题讨论】:

  • 这是 winforms/wpf/console 应用程序吗?杀死进程和gui似乎不是最好的做事方式..
  • 这是 wpf。 gui 我的意思是主应用程序

标签: c# wpf


【解决方案1】:

将您的文件存储在临时目录中并让操作系统处理它。

见Path.GetTempPath 和Path.GetTempFileName。

【讨论】:

    【解决方案2】:

    首先,您应该确定文件夹中的哪个文件被锁定 - 不是删除整个文件夹,而是删除单个文件。 然后检查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 等。

    【讨论】:

    • 我发现进程“Mastersolution.vhost.exe”保存着我试图删除的所有文件。 Mastersolution 实际上是我在“App.Current.Shutdown();”行上关闭的主要应用程序
    • @Ivan 这实际上意味着您没有在其他地方的应用程序中干净地关闭文件句柄。
    • 尝试调试您的应用程序并确保您明确关闭所有打开或创建的文件。如果您的应用程序很复杂,有一些工具可以帮助您,例如 jetbrains.com/profiler/index.html
    【解决方案3】:

    只要文件夹未在使用中并且您有权这样做,您就可以毫无问题地删除这些文件夹。 您可以使用 SysInternals Handle 来确定哪些进程正在访问您想要的文件/文件夹。请注意,如果您无法删除文件并且不是您的进程访问它们,只需发出警告:“无法清理文件夹:幻灯片预览”而不是随机杀死用户的应用程序,直到您可以删除 png。

    附带说明:提醒我不要使用会杀死办公室并放弃我所做的任何工作的应用程序。

    您应该使用您启动的每个进程的 pid,或者更好的是,使用 IPC 发送友好的关闭请求,该请求可以在关闭之前清理资源。对于 powerpoint,这很简单,只需在应用程序对象上调用 Quit()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 2017-01-11
      • 2012-04-09
      • 2010-10-22
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多