【问题标题】:Is it possible with Java to delete to the Recycle Bin?Java可以删除到回收站吗?
【发布时间】:2008-10-21 16:14:02
【问题描述】:

Java 是这里的关键。我需要能够删除文件,但用户希望能够从回收站中“取消删除”。据我所知,这是不可能的。有谁知道吗?

【问题讨论】:

    标签: java recycle-bin


    【解决方案1】:

    十年后,Java 9 终于有了一种将文件移动到垃圾箱的内置方法

    java.awt.Desktop.moveToTrash(java.io.File):

    public boolean moveToTrash​(File file)

    将指定的文件移动到回收站。

    参数:

    文件 - 文件

    返回:

    如果成功将文件移动到垃圾箱,则返回 true。

    可以使用Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH) 测试此功能对底层平台的可用性。

    【讨论】:

      【解决方案2】:

      由于各种原因 Windows has no concept of a folder that simply corresponds to the Recycle Bin.

      正确的方法是使用JNI调用Windows的SHFileOperation API,在SHFILEOPSTRUCT结构中设置FO_DELETE标志。

      【讨论】:

      • 这就像一个魅力!您还可以移至 Mac OS X 垃圾箱。
      • 它不适用于 iso-8859-1 编码,如果您的程序在计算机上使用的路径中使用特殊字符 (éèàñ...),它将无法工作...但是在英文电脑上没问题
      • @PaulLammertsma 哪一个适用于 Mac OS X,John 的答案还是 Drye 的?
      • IIRC,第二个链接(“发送到回收站”)适用于 Windows 和 OS X,因为它只是执行删除带有标志 FOF_ALLOWUNDO 的文件的默认操作。
      • 任何使用SHFileOperation 的东西都不能在OS X 上运行,因为SHFileOperation 是Windows 的API。
      【解决方案3】:

      Java 9 有新方法,但就我而言,我仅限于 Java 8。 我发现 Java Native Access PlatformhasTrash()moveToTrash() 方法。我为我在 Win 10 和 Mac OS (Worked) 上测试了它。

      static boolean moveToTrash(String filePath) {
              File file = new File(filePath);
      
              FileUtils fileUtils =  FileUtils.getInstance();
              if (fileUtils.hasTrash()) {
      
                  try {
                      fileUtils.moveToTrash(new File[] { file });
                      return true;
                  } catch (IOException e) {
                      e.printStackTrace();
                      return false;
                  }
              } else {
                  System.out.println("No Trash");
                  return false;
              }
          }
      

      Maven 存储库 https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform/5.1.0

      不要混淆它是Java Native Access Platform而不是Java Native Access

      【讨论】:

        【解决方案4】:

        我在 suns 网站上找到了这个 RFE: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5080625

        这告诉我没有本地 Java 方法可以做到这一点。正如@John Topley 刚刚发布的那样,唯一的解决方案是 JNI 调用。

        【讨论】:

          【解决方案5】:

          参见fileutil 孵化器项目(Java Desktop Integration Components 项目的一部分):

          创建这个孵化器项目是为了托管这些文件实用程序功能,其中大部分是对 J2SE 中 java.io.File 类的扩展。 Java 开发人员经常要求提供以下功能,例如:将文件发送到垃圾箱、检查可用磁盘空间、访问文件属性等。该项目解决了这些频繁请求的 API。

          请注意,这不仅适用于 Windows,还适用于其他平台(Linux、Mac OS X)。

          【讨论】:

          • 这两个链接都不起作用。 here 就是一个例子
          【解决方案6】:
          【解决方案7】:

          正如 John Topley 所建议的,您必须使用本机操作来执行此操作。如果您不想弄脏一些 JNI,您可以使用一个名为 Java Native Access 的库来执行本机调用。

          【讨论】:

            【解决方案8】:

            我的 3 美分 - 使用 cmd util Recycle.exe 和 -f 强制回收(无提示)。完美运行。

            public class Trash {
            
                public void moveToTrash(File ... file) throws IOException {
                    moveToTrash(false, file);
                }
            
                public void promptMoveToTrash(File ... file) throws IOException {
                    moveToTrash(true, file);
                }
            
                private void moveToTrash(boolean withPrompt, File ... file) throws IOException {
                    String fileList = Stream.of(file).map(File::getAbsolutePath).reduce((f1, f2)->f1+" "+f2).orElse("");
                    Runtime.getRuntime().exec("Recycle.exe "+(withPrompt ? "" : "-f ")+fileList);
                }
            
            }
            

            【讨论】:

              【解决方案9】:

              在 JNA 平台中,FileUtils 不使用 Win32 API。你应该更喜欢 W32FileUtils 支持撤消(从回收站恢复文件)。

              编辑:从当前版本的 JNA 平台 (5.7.0) 开始,使用 FileUtils.getInstance(),此语句已变得不正确,并且 FileUtils 将使用 Win32 API。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-10-02
                • 2018-03-03
                • 2010-11-18
                • 1970-01-01
                • 2013-04-04
                • 1970-01-01
                • 2018-07-05
                • 2011-04-29
                相关资源
                最近更新 更多