2013-01-08 30 views
0

我正在加載目錄樹視圖,它的子目錄。我呼籲:Windows 7庫和目錄結構

string[] dirs = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); 

回報所有我想要的目錄和一些我不...喜歡人跡罕至/虛擬「我的音樂」,「我的視頻」,等等......當然,我不能做任何由於庫結構(拒絕訪問)而在這些目錄中遞歸...

如何避免填充這些無法訪問的目錄?我可以遍歷數組,並刪除不需要的目錄,如果操作系統是Vista或7,並離開XP ...但我想知道是否有一個更優雅的解決方案呢?

與維姆的幫助下,我想出了這個:

private List<string> MyDocuments() 
    { 
     List<string> dirs = new List<string>(Directory.GetDirectories(
      Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))); 

     for (int i = 0; i < dirs.Count-1; i++) 
     { 
      DirectoryInfo di = new DirectoryInfo(dirs[i]); 
      if (di.Attributes.HasFlag(FileAttributes.ReparsePoint)) 
       dirs.RemoveAt(i); 
     } 

     return dirs; 
    } 
+0

你是什麼意思的「無法訪問」? –

+0

返回的結構包含「我的文檔\\我的音樂」....這是vista和7虛擬...如果你嘗試訪問任何在該路徑中的任何東西,你會得到訪問違規... – devHead

+0

我應該說「路徑」返回...不是結構... – devHead

回答

1

這些目錄似乎都隱藏的,有ReparsePoint屬性(要求他們是空的,從MSDN What is the best way to check for reparse point in .net (c#)?看到更多信息和閱讀this它是如何完成的)。

我可以理解需要搜索優雅的代碼,但事實是,您可以遍歷每個目錄並檢查此屬性,隨後將其添加到數組或目錄列表中,但不如迭代dirs數組,捕獲異常並刪除條目。所以,總之,我堅持:

List<string> dirs = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)).ToList(); 
string[] mySubDirs; 

for (int i = 0; i < dirs.Count-1; i++) 
{ 
    try 
    { 
     mySubDirs = Directory.GetDirectories(dirs[i]); 
    } 
    catch (Exception) 
    { 
     dirs.RemoveAt(i); 
    } 
} 
+0

感謝您的閱讀!我會在測試一些想法後回來! – devHead

+0

直到我看到更好,您提供的信息引導我到上面發佈的內容 – devHead