2008-10-30 54 views
1

乾脆把文件~/.Trash/將無法​​正常工作,因爲如果一個外部驅動器上的文件操作系統,它將文件移動到主系統驅動..OS X:確定回收站位置給定路徑

而且,還有其他條件,如外部驅動器上的文件被移動到/Volumes/.Trash/501/(或當前用戶的ID是什麼)

給定文件或文件夾路徑,確定垃圾文件夾的正確方法是什麼?我想這種語言是非常不相關的,但我打算使用Python

回答

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類似的東西。

+0

或者appscript,我懷疑。 – 2008-10-31 10:30:09

2

文件管理器API有一對稱爲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完成,特別是檢查,如果文件名中的垃圾已經存在(有幾件事避免覆蓋)和實際移動到垃圾,但它似乎涵蓋了大部分的東西(內部,外部和網絡驅動器)

更新:我想垃圾在Python腳本文件,所以我重新實現戴夫Dribin的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

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)