Hallo ich würde gerne wissen wie ich unter Windows eine Datei in den Papierkorb löschen kann! Ich hab auch schon ein bisschen ge-googelt, aber nichts brauchbares gefunden…
Wisst ihr wie das zu bewerkstelligen ist?
das “löschen in den papierkorb” ist eigentlich nichts weiter als ein file-move … also das verschieben des daten-deskriptors vom ursprungsordner in den speziellen “papierkorb-ordner” … mehr nicht
das heißt, doch, es ist schon etwas komplizierter als ein einfaches File.move(), aber grundsätzlich passiert genau das
und dazu wird es in der win-api sicher irgendwas geben was man dann mit JNA ansprechen kann, musst mal im MSDN nach suchen
Bei Apple ist es meines Wissens nicht mehr als ein verschieben der Datei in den .Trash Ordner, aber bei Windows gibt es den „physischen“ Ordner Papierkorb überhaupt nicht…
Mit JNA kenne ich mich überhaupt nicht aus! Was ist das? Woher bekomm ich das? Und wie lösch ich damit etwas in den Papierkorb??
Danke schonmal
Man kann hier fragen, oder
eine Suchmaschine nutzen:
[ul]
[li]Java Native Access – Wikipedia
[/li][li]JNA (Java Native Access) - Java Blog | Javainsel-Blog - tutego
[/li][li]My Small Tutorial: Java Native Access (JNA)
[/li][li]Java Native Access (JNA): Pure Java Access to Native Libraries
[/li][/ul]
Nur wild hineingegriffen, aber das kannst du auch.
*** Edit ***
Zum Thema: Is it possible with Java to delete to the Recycle Bin?
Also der Papierkorb in Windows hat schon (mindestens) ein physikalisches Verzeichnis (in “C:$recycler.bin” pro user eines und darin befinden sich dann erst ein oder mehrere versteckte Papierkorb-Verzeichnisse, wahrscheinlich pro beschreibbaren Datenträger eines), man muss nur einen Weg finden, wie man es (sie) ermittelt.
Mit normalen File-Objekten bekommt man es anscheinend nicht hin (weil versteckt mit $-Präfix usw), wenn dann nur über einen Reflection-Zugriff auf “java.io.FileSystem”. Evtl. gehts ja mit “java.nio.file” besser. Zumindest bleibt es letztendlich doch nur bei einer “.move()”-Aktion.
Ich finde relativ viel im Internet, aber leider nur total unkonkretes!
Das wär schön! Wie, ähh, sehe so eine move Aktion den nun, ähh, aus?
Hier werden zwei Möglichkeiten genannt. Mit der Methode moveToTrash(File file) kannst du eine Datei in den Papierkorb verschieben. Ich habe bisher immer die Klasse W32FileUtils verwendet, damit ist es ziemlich simpel.
[QUOTE=IDC]Wie, ähh, sehe so eine move Aktion den nun, ähh, aus?[/QUOTE]Das, ähh, entzieht sich, ähh, bisher auch noch meiner, ähhh, Kenntnis.
Woher bekomme ich die com.sun.etc Library? (Ich nutze Netbeans und dort wird mir gesagt das besagte Library nicht gefunden werden kann…)
Link gelesen? https://github.com/twall/jna
Sorry, das ich mich so spät wieder melde, hatte viel zu tun…
Link gelesen, nicht verstanden…
Woher hast du die spezielle Library? Hab die hier gefunden(LINK), aber die scheint leider die falsche zu sein =(
[QUOTE=IDC]Sorry, das ich mich so spät wieder melde, hatte viel zu tun…
Link gelesen, nicht verstanden…
Woher hast du die spezielle Library? Hab die hier gefunden(LINK), aber die scheint leider die falsche zu sein =([/QUOTE]
Wie gesagt, ich habe bisher nur die Klasse W32FileUtils verwendet. Die findest du in deinem Link. Es ist der dritte Download platform.jar.
Oh danke! Die hatte ich überlesen
Also wenn ich den Code jetzt so übernehme, dann bekomme ich folgenden Fehler:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/sun/jna/win32/StdCallLibrary
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.sun.jna.platform.win32.W32FileUtils.moveToTrash(W32FileUtils.java:28)
at pictureviewer.DataMover.moveFileToRecycleBin(DataMover.java:106)
at pictureviewer.Image_s.delImage(Image_s.java:57)
at pictureviewer.PictureViewer$ImagePanel.del(PictureViewer.java:195)
at pictureviewer.PictureViewer$2.actionPerformed(PictureViewer.java:75)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.focusLost(BasicButtonListener.java:198)
at java.awt.Component.processFocusEvent(Component.java:6397)
at java.awt.Component.processEvent(Component.java:6261)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:947)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:621)
at java.awt.Component.dispatchEventImpl(Component.java:4731)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.KeyboardFocusManager.dispatchAndCatchException(KeyboardFocusManager.java:2538)
at java.awt.KeyboardFocusManager.processCurrentLightweightRequests(KeyboardFocusManager.java:2630)
at java.awt.KeyboardFocusManager$2.run(KeyboardFocusManager.java:2741)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Caused by: java.lang.ClassNotFoundException: com.sun.jna.win32.StdCallLibrary
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 51 more
Muss ich noch was machen bevor ich den Code benutzen kann?
OK, dir fehlt eine Klasse, die sich in der jna.jar befindet. Also musst du sowohl die jna.jar als auch die platform.jar in dein Projekt einbinden.
Danke, jetzt kommt falscher Parameter Exception!
java.io.IOException: Move to trash failed: Falscher Parameter.
at com.sun.jna.platform.win32.W32FileUtils.moveToTrash(W32FileUtils.java:39)
at pictureviewer.DataMover.moveFileToRecycleBin(DataMover.java:106)
at pictureviewer.Image_s.delImage(Image_s.java:57)
at pictureviewer.PictureViewer$ImagePanel.del(PictureViewer.java:195)
at pictureviewer.PictureViewer$2.actionPerformed(PictureViewer.java:75)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.focusLost(BasicButtonListener.java:198)
at java.awt.Component.processFocusEvent(Component.java:6397)
at java.awt.Component.processEvent(Component.java:6261)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:947)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:621)
at java.awt.Component.dispatchEventImpl(Component.java:4731)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.KeyboardFocusManager.dispatchAndCatchException(KeyboardFocusManager.java:2538)
at java.awt.KeyboardFocusManager.processCurrentLightweightRequests(KeyboardFocusManager.java:2630)
at java.awt.KeyboardFocusManager$2.run(KeyboardFocusManager.java:2741)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Wie kommt das zustande?
Zeig mal was du übergibst.
Die Methode erwartet übrigens ein File-Array.
public void moveToTrash(File[] files)
Ich übergebe:
FileUtils fileUtils = FileUtils.getInstance();
if (fileUtils.hasTrash()) {
try {
fileUtils.moveToTrash( new File[] {file});
} catch (IOException ioe) {
System.out.println(file);
ioe.printStackTrace();
}
} else {
System.out.println("No Trash available");
}
Wobei file eine existierende File ist…
Ich bin auf den Sprung, aber die Fehlermeldung bezieht sich auf die Klasse W32FileUtils, aber dein Code enthält die Klasse FileUtils - nicht W32FileUtils. Hast du beides drinne und beim zweiten Mal ist das File schon verschoben? So, bin erst morgen wieder da.
Ich habs immer noch nicht gelöst! Hättest du vielleicht noch eine Idee? :o
Wie gesagt, dein gezeigter Quellcode passt nicht mit der Fehlermeldung zusammen. Zeig mehr Code, am Besten die ganze Klasse.