Python: Check if a directory is an alias

夙愿已清 提交于 2019-12-20 03:16:55

问题


Does python have a simple function for checking if a directory is an actual directory or if it's just an alias to another directory? I'm trying to list all files/folders in a directory but because of these alias folders, I'm getting a lost of stuff that looks like this:

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle

I know I can write a function that will compare paths and quit if it seems like I'm going in circles, but is there a simple function that does exactly that that I'm not aware of? E.g. os.isAlias( …pathname… )

Thanks!


回答1:


Here's a version of os.path.realpath that works on Mac aliases as well as on symbolic links under Python 2:

from Carbon import File
def osx_realpath (path):
    return File.FSResolveAliasFile(path, True)[0].as_pathname()

If you call osx_realpath on each directory before you recurse into it you should avoid duplication. Alternatively you could define something like

def is_osx_realpath (path):
    return path == osx_realpath(path)

Here you have to worry a little about false negatives, however. If you filter for is_osx_realpath and the path you start with is an alias, your program will stop without looking at anything.

So far I don't know of a way to do this under Python 3. I have a question here where I'm hoping for an answer. Right now I can't do better than using subprocess.call to invoke something that does the check on the command line.

EDIT: I should add that not only is Carbon.File not available in Python 3, but it is deprecated and so is best avoided in Python 2 as well--however it's the most pragmatic solution I know of for Python 2 at present.

EDIT 2: here is a way to check if a file is an alias that I believe to be Python 3-friendly. However, I don't have code to resolve the alias. I believe you need PyObjC installed.

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)




回答2:


The answer above is incorrect. While it is true that Finder reports symlinks as alias, they are distinct things.

Symlinks are a basic feature of UNIX, but alias are a Apple only feature. If you doubt this create a symlink to a directory and an alias. The symlink will be small typically 50-100 bytes, whereas the alias can be several MB.

os.path.islink( … ) will report symlinks, but not alias.

I am not sure how you would find them in Python, but the following link shows other methods.

https://stackoverflow.com/a/21151368/838253




回答3:


You can check whether a file or directory is an alias with the GetFileInfo command in Mac OS X. GetFileInfo -aa foo prints a line with "1" if foo is an alias and "0" if not.

import subprocess

def is_alias(path):
    return subprocess.check_output(["GetFileInfo", "-aa", path]) == "1\n"

Seems a little sad to spawn a process for every check, but I think this works with versions of Mac OS X since probably 10.4.4 (2006), 32-bit, 64-bit, Python 2 and Python 3. The version of GetFileInfo I have (from 2009) is a "universal" i386 + PPC binary.

GetFileInfo is part of Xcode, which is large, but you can download the command-line tools separately (see the "Separate Download" section here).

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/GetFileInfo.1.html



来源:https://stackoverflow.com/questions/21192167/python-check-if-a-directory-is-an-alias

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!