简单地将文件移动到~/.Trash/
将无法正常工作,就像外部驱动器上的文件操作系统一样,它会将文件移动到主系统驱动器..
此外,还有其他条件,例如外部驱动器上的文件被移动到/Volumes/.Trash/501/
(或者当前用户的ID是什么)
给定文件或文件夹路径,确定垃圾文件夹的正确方法是什么?我想这种语言非常无关紧要,但我打算使用Python
答案 0 :(得分:5)
或者,如果您使用的是OS X 10.5,则可以使用Scripting Bridge通过Finder删除文件。我已经通过RubyCocoa在Ruby代码here中完成了这个。它的要点是:
url = NSURL.fileURLWithPath(path)
finder = SBApplication.applicationWithBundleIdentifier("com.apple.Finder")
item = finder.items.objectAtLocation(url)
item.delete
您可以轻松地使用PyObjC做类似的事情。
答案 1 :(得分:4)
根据http://www.cocoadev.com/index.pl?MoveToTrash的代码,我提出了以下内容:
def get_trash_path(input_file):
path, file = os.path.split(input_file)
if path.startswith("/Volumes/"):
# /Volumes/driveName/.Trashes/<uid>
s = path.split(os.path.sep)
# s[2] is drive name ([0] is empty, [1] is Volumes)
trash_path = os.path.join("/Volumes", s[2], ".Trashes", str(os.getuid()))
if not os.path.isdir(trash_path):
raise IOError("Volume appears to be a network drive (%s could not be found)" % (trash_path))
else:
trash_path = os.path.join(os.getenv("HOME"), ".Trash")
return trash_path
相当基本,并且有一些事情必须分开进行,特别是检查文件名是否已经存在于垃圾箱(以避免覆盖)和实际移动到垃圾箱,但它似乎涵盖了大多数事情(内部,外部)和网络驱动器)
更新:我想在Python脚本中删除文件,所以我在Python中重新实现了Dave Dribin的解决方案:
from AppKit import NSURL
from ScriptingBridge import SBApplication
def trashPath(path):
"""Trashes a path using the Finder, via OS X's Scripting Bridge.
"""
targetfile = NSURL.fileURLWithPath_(path)
finder = SBApplication.applicationWithBundleIdentifier_("com.apple.Finder")
items = finder.items().objectAtLocation_(targetfile)
items.delete()
用法很简单:
trashPath("/tmp/examplefile")
答案 2 :(得分:3)
更好的方法是NSWorkspaceRecycleOperation,这是您可以与-[NSWorkspace performFileOperation:source:destination:files:tag:]一起使用的操作之一。常数的名字是Cocoa的NeXT遗产的另一件神器;它的功能是将项目移动到废纸篓。
由于它是Cocoa的一部分,它应该可用于Python和Ruby。
答案 3 :(得分:2)
文件管理器API有一对名为FSMoveObjectToTrashAsync和FSPathMoveObjectToTrashSync的函数。
不确定是否暴露给Python。
答案 4 :(得分:2)
在Python中,不使用脚本桥,您可以这样做:
from AppKit import NSWorkspace, NSWorkspaceRecycleOperation
source = "path holding files"
files = ["file1", "file2"]
ws = NSWorkspace.sharedWorkspace()
ws.performFileOperation_source_destination_files_tag_(NSWorkspaceRecycleOperation, source, "", files, None)
答案 5 :(得分:1)
红宝石中的另一个:
Appscript.app('Finder').items[MacTypes::Alias.path(path)].delete
您需要rb-appscript gem,您可以阅读here