【问题标题】:Deleting a directory on exit in Java在 Java 中退出时删除目录
【发布时间】:2012-06-25 06:53:18
【问题描述】:

我只是想知道应用程序关闭时是否可以删除目录?

应用程序关闭时有没有简单的方法来做某事?

目前我的应用程序在运行时下载类文件,所以我真正想要的是从客户端系统中删除它们。

我已经试过了

File directory = new File("macros/bin/");
directory.deleteOnExit();

以及在运行时删除下载的启动文件(显然无法完成,因为它需要它们才能运行)。

【问题讨论】:

  • 如果这些类文件是在 JVM 中加载的,那么 MS Windows 可能不会让你删除它们

标签: java directory


【解决方案1】:

你可以试试这个:

Runtime.getRuntime().addShutdownHook(new Thread() {

      @Override
      public void run() {
        /* Delete your file here. */
      }
 });

很大程度上取决于您的程序如何结束。

【讨论】:

  • 在大多数系统上,关闭挂钩在每个实例上运行,但 kill -9 这是预期行为。
  • 您可能应该将其贡献给 Apache commons-io,因为我认为您的实现更好地反映了实际需求。 commons-io 目前的实现是在调用时注册目录中的文件,而不是在所有处理完成后注册。
  • 您的代码中缺少一个圆括号,并且由于某些奇怪的原因,所以不允许我更正那个...
【解决方案2】:

您应该使用Apache Commons IO 执行以下操作:

Runtime.getRuntime().addShutdownHook(new Thread(() -> FileUtils.deleteQuietly(fileOrDir)));

注意:FileUtils.forceDeleteOnExit 实现存在缺陷: 它在目录注册期间注册要删除的文件, 因此,如果稍后添加文件,它将无法删除目录。

【讨论】:

    【解决方案3】:

    为了记录,javadoc 说directory.deleteOnExit() 应该可以工作......该方法应该适用于目录。但是,该方法可能会失败,因为在尝试删除它时该目录不为空……而且操作系统通常不会让您删除非空目录。

    解决方案是为用户下载的文件调用deleteOnExit()。您必须在directory.deleteOnExit() 调用之后执行此操作。请参阅 javadoc 了解原因。

    话虽如此,显式关闭挂钩是一种更强大的方法。

    【讨论】:

      【解决方案4】:

      你可以使用这个:org.apache.commons.io.FileUtils.forceDeleteOnExit(File)

      /*
       * Schedules a file to be deleted when JVM exits.
       * If file is directory delete it and all sub-directories.
       */
      FileUtils.forceDeleteOnExit(File)
      

      限制:
      不幸的是,这仅在调用 forceDeleteOnExit 之后没有在目录内创建其他文件和/或文件夹时才有效。

      【讨论】:

        【解决方案5】:

        这对我有用。 递归函数。

        public static void makeVolatile(File folder)
        {
            folder.deleteOnExit();
            for(File f : folder.listFiles())
            {
                if(f.isDirectory())
                    makeVolatile(f);
                else
                    f.deleteOnExit();
            }
        }
        

        【讨论】:

        • 这不会删除新添加的文件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        相关资源
        最近更新 更多