2008-10-30 3 views
1

Просто перемещение файла ~/.Trash/ не будет работать, как если бы файл ОС на внешнем диске, он будет переместить файл в основной системный диск ..OS X: Определение местоположения корзины для заданного пути

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

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

ответ

5

В качестве альтернативы, если вы используете OS X 10.5, вы можете использовать Scripting Bridge для удаления файлов через Finder. Я сделал это в Ruby-коде here через RubyCocoa. Суть его заключается в следующем:

url = NSURL.fileURLWithPath(path) 
finder = SBApplication.applicationWithBundleIdentifier("com.apple.Finder") 
item = finder.items.objectAtLocation(url) 
item.delete 

Вы можете легко сделать что-то подобное с PyObjC.

+0

Или подозрительный. – 2008-10-31 10:30:09

2

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

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

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 

довольно простой, и есть несколько вещей, которые нужно сделать seperatly, в частности, проверки, если файл уже существует в корзину (в избежать перезаписи) и фактическое перемещение в корзину, но это, кажется, покрывает большинство вещей (внутренние, внешние и сетевые диски)

Update: Я хотел громить файл в сценарии 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") 
+0

Реимитация Python не работала для меня, файлы были все еще там после запуска trashPath. Решение, предложенное Эшли Кларк, действительно сработало. – 2011-03-05 17:32:51

3

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

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

1

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

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

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

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) 
Смежные вопросы