What replaces the now-deprecated Carbon.File.FSResolveAliasFile in Python on OSX?

后端 未结 3 1708
夕颜
夕颜 2020-12-21 18:33

In Python 2, I can use the following code to resolve either a MacOS alias or a symbolic link:

from Carbon import File
File.FSResolveAliasFile(alias_fp, True)         


        
相关标签:
3条回答
  • 2020-12-21 18:54

    The APIs those modules use are deprecated by Apple, it appears. You should use POSIX APIs instead.

    os.path.realpath(FILE_OBJECT.name)
    
    0 讨论(0)
  • 2020-12-21 19:00

    The following Cocoa code will resolve alias.

    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);
    }
    

    I don't know how to invoke Cocoa framework from Python, but I am sure someone has done it

    The following link shows code to resolve aslias or symlink https://stackoverflow.com/a/21151368/838253

    0 讨论(0)
  • 2020-12-21 19:11

    The PyObjC bridge lets you access NSURL's bookmark handling, which is the modern (backwards compatible) replacement for aliases:

    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 讨论(0)
提交回复
热议问题