2012-03-22 167 views
7

我有一個腳本,用於搜索包含特定文件的目錄,從當前目錄開始並向上搜索(想想如何找出.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 

現在用這種方法的問題在於,如果它不能找到目錄,它循環(並最終堆棧溢出),因爲顯然加入/..給你/。我試過將pathparentrepr進行比較,但那不起作用(它們總是不同的)。我現在的解決方法是在遞歸方法中包含一個深度計數器,並在某個隨機最大閾值處停止。

我的問題是,是否有可靠的跨平臺方法來檢查我是否已經到達文件系統的根目錄?

+1

我不完全確定它是否在所有平臺上都可靠,但是如果os.path.dirname(path)==路徑,那麼它看起來像路徑是根。 – 2012-03-22 13:25:40

回答

7

我不認爲你可以找出它是否是一個文件系統根portably然而,我會建議打電話os.path.realpath()當前目錄和計算出的父母和比較,如果他們是相同的 - 這意味着你正在旋轉你的輪子,並且沒有任何意義。

例如:

>>> os.path.realpath('/usr/bin/..') 
'/usr' 
>>> os.path.realpath('/usr/bin/../..') 
'/' 
>>> os.path.realpath('/usr/bin/../../..') 
'/' 
>>> os.path.realpath('/..') 
'/' 
16
if os.path.dirname(path) == path: 
    # you have yourself root. 
    # works on Windows and *nix paths. 
    # does NOT work on Windows shares (\\server\share) 
+1

它在Windows共享上工作,但它不表示共享是根,它認爲\\服務器是根。無論如何,這真的讓IMO更有意義。 – 2012-10-26 13:56:32

+0

@nacitarsevaht你可能是對的。將\\服務器視爲root會更有意義,但會減少實際使用,因爲通過使用「list dir」的普通工具來枚舉\\服務器的內容是不實際的。 – ddotsenko 2012-10-29 20:19:36

+0

如果路徑包含「..」元素,例如在@ FatalError的答案中,此答案不起作用。 – jmh 2013-10-18 15:27:40

1

這爲我們工作在Linux上。然而,不確定Windows:

def _find_root(start, stop, func=os.path.exists): 
    """Search up the start hierarchy for stop; return None at the FS root. 

    Uses func() to determine if stop exists; default is os.path.exists(). 
    """ 
    if func(os.path.join(start, stop)): 
     return start 
    else: 
     if os.path.samefile(start, os.path.dirname(start)): 
      return None 
     else: 
      return _find_root(os.path.dirname(start), stop) 

我們在調用此函數時使用os.path.normpath(start)。

相關問題