Send2Trash:跨平台文件回收,一个函数搞定

send2trash 在 GitHub 上拿到了 309 Star。

做桌面应用开发的人都会碰到这个问题:用户点了删除,到底该真删还是送回收站。真删了用户反悔找不回来,不删又占着磁盘。Send2Trash 解决的就是这个,它调用各平台原生的回收机制,把文件送进回收站或废纸篓。

1、 这库是干嘛的

就一件事,跨平台把文件安全送到系统回收站。

Windows 上调用 IFileOperation(Vista 及以上),这是系统标准回收接口。旧版本系统上自动降级到 SHFileOperation。macOS 通过 FSMoveObjectToTrashSync 的 Cocoa 原生调用来实现,也可以退一步用 pyobjc 的 NSFileManager。Linux 优先用 GIO,不可用时走 freedesktop.org 的 trash 规范协议,自己处理 .Trash 目录的创建和文件元数据记录。

每个平台至少有两层方案,首选原生接口,不可用则降级到备选。平台检测和接口选择都在运行时自动处理,调用方不需要关心底层差异,一份代码在所有系统上表现一致。所有底层调用通过 ctypes 完成,不需要 C 编译器和额外构建步骤,装完即用。

正文顶部截图

2、 为什么不用 shutil.rmtree

shutil.rmtree 和 os.remove 走直接删除路径,文件从磁盘消失,没有挽回余地。用户点错了就彻底没救。系统维护脚本处理临时文件用它们问题不大,面向用户的桌面工具就需要更谨慎的方案。

Send2Trash 走回收站路径。用户反悔了可以打开回收站恢复,和操作系统自带的删除行为一致。用户眼里的删除就是进回收站,直接擦除不符合直觉。Python 标准库里目前没有提供跨平台的回收站接口,这个库正好填补了这块空白。

两个库各有定位,开发者可以根据场景做选择。项目维护者在征集各平台的问题反馈,碰到回收失败的情况可以给项目提 issue。

3、 安装

通过 pip 安装:

pip install -U send2trash

需要操作系统的原生库支持时(pywin32 或 pyobjc),装带 extra 的版本:

pip install -U send2trash[nativeLib]

原生库只用来启用更底层接口,不是强制依赖。不装也能正常运行。Linux 系统如果开启 PEP 668 保护,建议在虚拟环境中安装。

README区域截图

4、 使用

接口只有一个 send2trash 函数:

from send2trash import send2trash

send2trash('some_file')
send2trash(['some_file1', 'some_file2'])

单文件路径和路径列表都支持。调用后文件进入系统回收站,和用户在文件管理器按删除键效果一样。

Linux 上有个边界情况。文件所在设备不是用户主目录所在设备,且根目录没有 .Trash 目录,也没有权限创建 .Trash-$UID 目录时,send2trash 会抛出 TrashPermissionError。应用层捕获后做降级处理,比如提示用户手动清理。其他异常走 OSError。两类异常的处理策略不同,桌面应用建议分开捕获。

5、 适合哪些人用

  • 写文件管理器或桌面工具的开发者,需要删除操作和系统回收站一致
  • 需要批量处理文件但不想冒数据丢失风险的 Python 脚本
  • 任何需要给删除操作留撤回余地的场景

Send2Trash 轻量、接口简单、不引入多余抽象。跨平台安全删除的需求,它是最直接的选择。项目代码在 GitHub 上开源,有问题可以直接提 issue 或贡献 pr。

多余抽象。跨平台安全删除的需求,它是最直接的选择。项目代码在 GitHub 上开源,有问题可以直接提 issue 或贡献 pr。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐