OS X: определить расположение корзины для заданного пути - PullRequest
1 голос
/ 30 октября 2008

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

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

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

Ответы [ 6 ]

5 голосов
/ 30 октября 2008

В качестве альтернативы, если вы используете 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.

4 голосов
/ 31 октября 2008

На основании кода от 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")
3 голосов
/ 07 марта 2009

Лучшим способом является NSWorkspaceRecycleOperation , который является одной из операций, которые вы можете использовать с - [NSWorkspace executeFileOperation: источник: назначение: файлы: тег:] . Имя константы является еще одним артефактом NeXT-наследия Какао; его функция - переместить элемент в корзину.

Поскольку он является частью Cocoa, он должен быть доступен как для Python, так и для Ruby.

2 голосов
/ 16 февраля 2011

В 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)
2 голосов
/ 30 октября 2008

В File Manager API есть пара функций, называемых FSMoveObjectToTrashAsync и FSPathMoveObjectToTrashSync.

Не уверен, подвержен ли он воздействию Python или нет.

1 голос
/ 07 сентября 2010

Еще один в рубине:

Appscript.app('Finder').items[MacTypes::Alias.path(path)].delete

Вам понадобится rb-appscript gem, вы можете прочитать об этом здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...