Tcl 跨平台移动到垃圾箱

Tcl 跨平台移动到垃圾箱,tcl,Tcl,是否有跨平台的方式将文件移动到垃圾箱文件删除完全删除文件,并且在unixen上不可撤消。即使仅在Linux上,也不能直接找出垃圾目录,因为它通常依赖于文件管理器 我求助于做: exec gio trash $file 问题是,这只适用于Gnome,因此即使在Linux上,它也不是跨平台的 由于我没有Windows机器,弄清楚垃圾桶/回收站在Windows中是如何工作的就更加困难了 对于每个用户,必须有一个“主垃圾”目录。它的名字 和位置为$XDG_数据_主页/垃圾桶$XDG_DATA_HOME

是否有跨平台的方式将文件移动到垃圾箱<代码>文件删除完全删除文件,并且在unixen上不可撤消。即使仅在Linux上,也不能直接找出垃圾目录,因为它通常依赖于文件管理器

我求助于做:

exec gio trash $file
问题是,这只适用于Gnome,因此即使在Linux上,它也不是跨平台的

由于我没有Windows机器,弄清楚垃圾桶/回收站在Windows中是如何工作的就更加困难了

对于每个用户,必须有一个“主垃圾”目录。它的名字 和位置为$XDG_数据_主页/垃圾桶$XDG_DATA_HOME是基础 用户特定数据的目录,如桌面库中定义的 目录规范

如果$XDG_DATA_HOME未设置或为空,则默认为$HOME/.local/share

但是,您不能只将文件移入或移出~/.local/share/Trash。有一些元数据文件存储原始位置和时间戳。这些元数据文件是纯文本的,因此可以在Tcl中轻松处理

因此,这听起来似乎可以很容易地在Tcl模块中实现。但是如果这样的模块已经存在,我不知道。对于学习Tcl的人来说,这可能是一个不错的项目

新增信息:


像往常一样,去营救窗户。该软件包有一个
recycle\u文件
命令。

下面介绍如何在macOS上执行此操作。这需要扩展包:

package require Tclapplescript

proc trash args {
    set TRASH_CMD {
        tell application "Finder" to delete POSIX file "%s"
    }
    foreach file $args {
        set fullFilename [file normalize $file]
        set quoted [string map {\\ \\\\ \\" \\\\"} $fullFilename]
        AppleScript execute [format $TRASH_CMD $quoted]
    }
}
在最新版本的macOS上,您需要在运行时授予适当的权限才能让它工作(或者至少在测试它时我必须这样做)

另见:


但这还不包括Windows和OSXHmm。我发现Gnome不符合这个规范。在我使用的Ubuntu和Linux Mint上,文件转到
$HOME/Trash-${disk\u uid}
。例如,在我的笔记本电脑上,我有一个文件夹
$HOME/Trash-1000
,如果可能的话,我倾向于忽略Windows和OSX。在windows上,看起来您应该能够使用twapi来实现这一点。twapi_shell包有一个recycle_file命令。那看起来是个好的开始。OSX相当简单,因为垃圾箱的工作方式从一开始就没有改变。这就给我们留下了Linux/BSD/OpenSolaris的所有变体,其中垃圾箱的工作方式不仅取决于窗口管理器,还取决于文件浏览器。您是否使用加密的主目录,使其看起来位于单独的分区中?该规范说:“如果没有$topdir/.Trash目录,则$topdir/.Trash-$uid目录将用作此设备/分区的用户垃圾目录。$uid是用户的数字标识符。”最好结合@SchelteBron的答案阅读,该答案描述了如何处理其他平台。此外,找到正确的Applescript咒语是想出这个答案最困难的部分;不幸的是,这里有很多微妙的错误代码……我想知道这一版本适合多少操作系统的修订。