在Python 2中,我可以使用以下代码来解析MacOS别名或符号链接:
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的解决方案工作(对Cocoa一无所知)而且stuff I find elsewhere on the internet看起来要复杂得多(也许它处理各种边缘情况?)。
答案 0 :(得分: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
的代码答案 1 :(得分: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
答案 2 :(得分:0)
这些模块使用的API已被Apple弃用。您应该使用POSIX API。
os.path.realpath(FILE_OBJECT.name)