2014-01-20 70 views
1

在Python 2,我可以使用下面的代碼來解決或者MacOS的別名或符號鏈接:在OSX上用Python代替現在不推薦使用的Carbon.File.FSResolveAliasFile是什麼?

from Carbon import File 
File.FSResolveAliasFile(alias_fp, True)[0].as_pathname() 

其中alias_fp是通向我很好奇的文件存儲爲一個字符串(source )。

但是,the documentation cheerfully tells me that the whole Carbon family of modules is deprecated。我應該用什麼來代替?

編輯:我相信下面的代碼是PyObjC方法的正確方向的一步。它不會解析別名,但似乎可以檢測到它們。

from AppKit import NSWorkspace 
def is_alias (path): 
    uti, err = NSWorkspace.sharedWorkspace().typeOfFile_error_(
     os.path.realpath(path), None) 
    if err: 
     raise Exception(unicode(err)) 
    else: 
     return "com.apple.alias-file" == uti 

source

不幸的是,我沒能得到@ Milliways的解決方案工作(一無所知約可可)和stuff I find elsewhere on the internet看起來複雜得多(也許是處理各種邊緣情況?)。

回答

1

的PyObjC橋讓您訪問NSURL的書籤處理,這是現代(向後兼容)替換別名:

import os.path 
from Foundation import * 

def target_of_alias(path): 
    url = NSURL.fileURLWithPath_(path) 
    bookmarkData, error = NSURL.bookmarkDataWithContentsOfURL_error_(url, None) 
    if bookmarkData is None: 
     return None 
    opts = NSURLBookmarkResolutionWithoutUI | NSURLBookmarkResolutionWithoutMounting 
    resolved, stale, error = NSURL.URLByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_(bookmarkData, opts, None, None, None) 
    return resolved.path() 

def resolve_links_and_aliases(path): 
    while True: 
     alias_target = target_of_alias(path) 
     if alias_target: 
      path = alias_target 
      continue 
     if os.path.islink(path): 
      path = os.path.realpath(path) 
      continue 
     return path 
+0

我添加了一個包裝器函數來解析別名和符號鏈接。 – MagerValp

-1

這些模塊使用的API已被Apple棄用,它顯示出來了。您應該使用POSIX API。

os.path.realpath(FILE_OBJECT.name) 
+0

對不起 - 我標記爲接受過早。它似乎適用於符號鏈接,但不適用於別名。現在我想到了,我認爲別名是Mac特有的,因此不太可能被POSIX工具處理。 – kuzzooroo

+0

我不相信有一個標準的庫方法來做到這一點。所有OSX特定模塊已在Python 3中刪除,因爲蘋果刪除/貶值了支持它們的API。 – Nyx

+0

http://pythonhosted.org/pyobjc/可能對另一個答案有用。同樣,不是一個標準的庫選項,但如果你做很多可可調用,這將是方式。 – Nyx

1

下面的Cocoa代碼將解析別名。

NSURL *targetOfAlias(NSURL *url) { 
    CFErrorRef *errorRef = NULL; 
    CFDataRef bookmark = CFURLCreateBookmarkDataFromFile (NULL, (__bridge CFURLRef)url, errorRef); 
    if (bookmark == nil) return nil; 
    CFURLRef resolvedUrl = CFURLCreateByResolvingBookmarkData (NULL, bookmark, kCFBookmarkResolutionWithoutUIMask, NULL, NULL, false, errorRef); 
    CFRelease(bookmark); 
    return CFBridgingRelease(resolvedUrl); 
} 

我不知道如何從Python中調用Cocoa框架,但我相信有人已經做到了

下面的鏈接顯示的代碼來解決aslias或符號鏈接https://stackoverflow.com/a/21151368/838253

+0

@SevenBits我同意這並沒有解決問題,但解決了其他問題。別名可以使用'CoreFoundation'而不是'Carbon'來解析。對於能夠編寫Python包裝的人來說,這將會非常有用。 – Milliways

+0

很難想出任何語言 - 至少這幫助我用C++完成它。讓我擺脫downvote .. – AudioGL

+0

上述解決方案由[Apple's Documentation on FSResolveAliasFile]中的** Deprecated **通知備份(https://developer.apple.com/reference/coreservices/1444372- fsresolvealiasfile?語言= objc)。 –

相關問題