2012-09-21 63 views
1

有關文件列表,我試圖確定共同的父目錄。該文件將不會在同一個目錄下(測試的部分)......我想vb.net找到共同的父目錄

Dim myParentDirectory As String = Path.GetDirectoryName(list.Item(0)) 
Dim myCurrentDirectory As String 
For Each file in list 
    myCurrentDirectory = Path.GetDirectoryName(file) 
    While myCurrentDirectory <> myParentDirectory And... And myParentDirectory <> Nothing '(or <> to a top level directory like "c:") 
    myParentDirectory = Directory.GetParent(myParentDirectory.ToString()) 
    End While 
Next 

的......代表「myCurrentDirectory不是myParentDirectory的子目錄」但我還沒有發現任何測試 - 僅列出目錄內容的方法。

如何獲得兩個文件(或目錄)的公用目錄父?

+2

'StartsWith'? – SLaks

+0

@SLaks感謝您的建議,我最終實現了它。 – Thalia

回答

1

我有一個可行的解決方案。

一起來定義一個遞歸函數,讓你所有的給定文件夾的祖先文件夾列表:

Dim recurse As Func(Of DirectoryInfo, IEnumerable(Of string)) = Nothing 
recurse = _ 
    Function (di) 
     If di Is Nothing Then 
      Return Enumerable.Empty(Of String)() 
     Else 
      Return Enumerable.Repeat(di.FullName, 1).Concat(recurse(di.Parent)) 
     End If 
    End Function 

然後,它只是一個讓兩個組這樣的路徑和返回的交集的事最長的一個。

像這樣:

Dim di1 As new DirectoryInfo("E:\James\Media\Podcasts\TEDTalks (video)") 
Dim di2 As new DirectoryInfo("E:\James\Media\Music\A Clash of Kings") 

Dim result = 
    recurse(di1) _ 
     .Intersect(recurse(di2)) _ 
     .OrderByDescending(Function (x) x.Length) _ 
     .First() 

Console.WriteLine(result) 

結果是 「E:\詹姆斯\媒體」。

可能有更漂亮的版本,但它的工作原理。

+0

我喜歡這個,雖然我寫了一個使用上述「StartsWith」 - 「current = getdirname(file);而不是dir以parent開頭的小小黑客;如果di.Parent沒有任何返回; parent = di.parent.fullname ; di =新目錄(父);結束,而「-----問題是,對於20,000個文件和一個相當淺的結構,哪個版本可能會更快? – Thalia

+0

@emptyheaded - 與文件系統訪問時間相比,兩種方法所花費的時間應該是微不足道的。去哪個更適合你。 – Enigmativity