Просто переместить файл на ~/.Trash/ не получится, так как если файл находится на внешнем диске, он переместит файл на основной системный диск.
Кроме того, есть и другие условия, например, файлы на внешних дисках перемещаются на /Volumes/.Trash/501/ (или независимо от идентификатора текущего пользователя).
Как правильно определить папку для мусора, учитывая путь к файлу или папке? Я полагаю, что язык не имеет значения, но я собираюсь использовать Python






В API диспетчера файлов есть пара функций, называемых FSMoveObjectToTrashAsync и FSPathMoveObjectToTrashSync.
Не уверен, что это доступно для Python или нет.
В качестве альтернативы, если вы используете OS X 10.5, вы можете использовать Scripting Bridge для удаления файлов через Finder. Я сделал это в Ruby-коде здесь через RubyCocoa. Суть этого:
url = NSURL.fileURLWithPath(path)
finder = SBApplication.applicationWithBundleIdentifier("com.apple.Finder")
item = finder.items.objectAtLocation(url)
item.delete
Вы можете легко сделать что-то подобное с PyObjC.
На основе кода из 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:
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")
Лучший способ - NSWorkspaceRecycleOperation, который является одной из операций, которые вы можете использовать с - [NSWorkspace performFileOperation: источник: место назначения: файлы: тег:]. Имя константы - еще один артефакт наследия Cocoa NeXT; его функция - переместить элемент в корзину.
Поскольку он является частью Cocoa, он должен быть доступен как для Python, так и для Ruby.
Еще один в рубине:
Appscript.app('Finder').items[MacTypes::Alias.path(path)].delete
Вам понадобится гем rb-appscript, можете про него прочитать здесь
В 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)
Повторная реализация Python не сработала для меня, файлы все еще были там после запуска trashPath на них. Решение, предложенное Эшли Кларк, действительно сработало.