我知道标准 Java 仍然没有提供将文件放入回收站/垃圾箱而不是永久删除它们的标准方法。但幸运的是,有针对 WIndows (jna) 和 OSX (com.apple.eio.FileManager) 的解决方案。
但是 Linux Dekstop 有什么东西吗,回收站是如何在 Linux 上实现的,它只是我可以将文件移动到的标准目录吗?
我知道标准 Java 仍然没有提供将文件放入回收站/垃圾箱而不是永久删除它们的标准方法。但幸运的是,有针对 WIndows (jna) 和 OSX (com.apple.eio.FileManager) 的解决方案。
但是 Linux Dekstop 有什么东西吗,回收站是如何在 Linux 上实现的,它只是我可以将文件移动到的标准目录吗?
Linux 中的垃圾文件夹位于/home/username/.local/share/Trash
. 尝试将文件移动到该文件夹。
两种最常见的 Linux 桌面环境(KDE、Gnome)使用freedesktop.org 垃圾规范。对于最常见的情况,这包括$XDG_DATA_HOME/Trash
. 如果环境变量未设置或为空,则$HOME/.local/share
使用。
此目录下有两个目录:files
和info
. files 包含已删除的文件,而 info 包含桌面样式文件,该文件提供有关已删除文件的信息,例如其原始名称和位置。请注意,文件中的文件files/
不必包含文件的原始名称(例如,在文件名冲突的情况下)。.trashinfo
在 info 目录中有一个匹配文件,其基本名称必须与 in 中的条目匹配files/
,因此例如调用foo
in的文件files/
将具有对应foo.trashinfo
的 in info/
。
文件内容.trashinfo
:
[Trash Info]
Path=<original path to file e.g. foo/bar/baz.txt>
DeletionDate=<Date file was deleted in RFC3339 format (YYYYMMDDTHH:MM:SS)>
它必须有这些行,否则它是畸形的。
规范中的注释指出:
删除文件或目录时,实现必须首先在 $trash/info 中创建相应的文件。当丢弃一个文件或目录时,实现必须首先在 $trash/info 中创建相应的文件。此外,它必须尝试以原子方式执行此操作,以便如果两个进程尝试使用相同文件名的垃圾文件,这将导致两个不同的垃圾文件。在 Unix 行系统上,这是通过生成文件名,然后使用 O_EXCL 打开来完成的。如果成功创建是原子的(至少在同一台机器上),如果失败,您需要选择另一个文件名。
所以你必须以这种方式执行垃圾操作。
这在 Java 中似乎是一个相对简单的练习,所以一旦你理解了它是如何完成的,那就去做吧!
在 kde 中还有 kfmclient CLI 工具,可以像这样使用:
kfmclient move <file> trash:/
哪个可以为您完成工作。不过,我不知道有 gnome 等价物。
您可以使用libtrash
, 最有可能从您的包管理器中获得。
正确配置后,它会为所有程序和命令添加回收站功能。