检查目录是否是(文件系统)根目录

Phi*_*ppe 9 python

我有一个脚本,它搜索包含特定文件的目录,从当前目录开始并上到树(考虑尝试找出.git目录所在的位置).

我的方法看起来像这样:

def getDir(self,cwd):
  path = os.path.abspath(cwd)
  if not os.path.isdir(path):
    raise RuntimeError("getDir should not be run on files")
  if FILE in os.listdir(path):
    return path
  parent = os.path.join(path, os.path.pardir)
  if os.access(parent, os.R_OK) and os.access(parent, os.X_OK):
    return self.getDir(parent)
  else
    return None
Run Code Online (Sandbox Code Playgroud)

现在这个方法的问题是,如果它找不到目录,它会循环(并最终堆栈溢出),因为显然加入/并再次..给你/.我尝试pathparent他们或他们的reprs 进行比较,但这不起作用(他们总是截然不同).我现在的解决方法是在递归方法中包含深度计数器并停在某个随机最大阈值处.

我的问题是,是否有一种可靠的跨平台方式来检查我是否已到达文件系统中的根目录?

ddo*_*nko 20

if os.path.dirname(path) == path:
    # you have yourself root.
    # works on Windows and *nix paths.
    # does NOT work on Windows shares (\\server\share)
Run Code Online (Sandbox Code Playgroud)

  • 它确实适用于 Windows 共享,但它并不表示共享是根......它认为 \\server 作为根。无论如何,老实说,IMO 更有意义。 (2认同)

Fat*_*ror 8

我不认为你可以看到它是否是一个文件系统根可移植,但是我建议os.path.realpath()在当前目录和你计算的父目录上进行调用并比较它们是否相同 - 这意味着你正在旋转你的车轮,没有必要继续前进.

例如:

>>> os.path.realpath('/usr/bin/..')
'/usr'
>>> os.path.realpath('/usr/bin/../..')
'/'
>>> os.path.realpath('/usr/bin/../../..')
'/'
>>> os.path.realpath('/..')
'/'
Run Code Online (Sandbox Code Playgroud)