OS X: определить местоположение корзины для заданного пути

Просто переместить файл на ~/.Trash/ не получится, так как если файл находится на внешнем диске, он переместит файл на основной системный диск.

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

Как правильно определить папку для мусора, учитывая путь к файлу или папке? Я полагаю, что язык не имеет значения, но я собираюсь использовать Python

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
3 468
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

В 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")

Повторная реализация Python не сработала для меня, файлы все еще были там после запуска trashPath на них. Решение, предложенное Эшли Кларк, действительно сработало.

Grzegorz Adam Hankiewicz 05.03.2011 20:32

Лучший способ - 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)

Другие вопросы по теме