什么可以代替OSX上Python中现已弃用的Carbon.File.FSResolveAliasFile?

发布于 2021-01-29 15:02:23

在Python 2中,我可以使用以下代码来解析MacOS别名或符号链接:

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

其中alias_fp是我很好奇的文件的路径,存储为字符串(source)。

但是,文档欣喜地告诉我,不赞成使用整个Carbon系列模块。我应该改用什么?

编辑:我相信下面的代码是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

来源

不幸的是,我无法使用@Milliways的解决方案(对可可一无所知),而我在互联网上其他地方发现的东西看起来要复杂得多(也许它正在处理各种边缘情况?)。

关注者
0
被浏览
89
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看