Is it possible with Java to delete to the Recycle Bin?

前端 未结 9 1824
夕颜
夕颜 2020-12-13 18:12

Java is the key here. I need to be able to delete files but users expect to be able to \"undelete\" from the recycle bin. As far as I can tell this isn\'t

相关标签:
9条回答
  • 2020-12-13 18:45

    I have found this RFE on suns site: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5080625

    This tells me there is not a native java way to do this. and as @John Topley just posted the only solution is a JNI call.

    0 讨论(0)
  • 2020-12-13 18:51

    For various reasons Windows has no concept of a folder that simply corresponds to the Recycle Bin.

    The correct way is to use JNI to invoke the Windows SHFileOperation API, setting the FO_DELETE flag in the SHFILEOPSTRUCT structure.

    • SHFileOperation documention
    • Java example for copying a file using SHFileOperation (the Recycle Bin link in the same article doesn't work)
    0 讨论(0)
  • 2020-12-13 18:51

    Java 9 has new method but in my case I am restricted to Java 8. I found Java Native Access Platform that has hasTrash() and moveToTrash() method. I tested it on Win 10 and Mac OS (Worked) for me.

    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 Repository https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform/5.1.0

    Don't confuse It is Java Native Access Platform not Java Native Access

    0 讨论(0)
  • 2020-12-13 18:53

    As John Topley suggests, you must do this with a native operation. In case you don't want to get your hands dirty with some JNI, you could use a library called Java Native Access to do the native calls.

    0 讨论(0)
  • 2020-12-13 18:57

    My 3 cents - use cmd util Recycle.exe with -f to force recycle (no prompt). Works perfectly.

    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);
        }
    
    }
    
    0 讨论(0)
  • 2020-12-13 18:58

    In JNA platform, the FileUtils doesn't use Win32 API. You should prefer W32FileUtils which supports Undo (restore the file from recycle bin).

    0 讨论(0)
提交回复
热议问题