2011-09-17 45 views
0

目前我有一個程序可以搜索音樂文件的用戶設置目錄和子目錄,並將它們添加到集合中。但是,如果它所涉及的目錄之一受到保護,那麼程序就會崩潰。我想知道如何檢查用戶是否有權訪問目錄,然後再嘗試搜索以避免此問題。 下面是我用於搜索的代碼,它目前包含了一個關於「系統卷信息」的基本工作,但由於可能存在其他受保護的目錄,我希望將其更改爲包含它們。如何檢查給定目錄的訪問權限?

public void SearchForMusic() 
    { 
     //Searches selected directory and its sub directories for music files and adds their path to ObservableCollection<string> MusicFound 
     foreach (string ext in extentions) 
     { 
      foreach (string song in Directory.GetFiles(SearchDirectory, ext)) 
      { 
       musicFound.Add(song);     
      } 

      foreach (string directory in Directory.GetDirectories(SearchDirectory)) 
      { 
       if (directory.Contains("System Volume Information")) 
       { 

       } 
       else 
       { 
        foreach (string song in Directory.GetFiles(directory, ext)) 
        { 
        musicFound.Add(song); 
        } 

        foreach (string subDirectory in Directory.GetDirectories(directory)) 
        { 
         foreach (string subSong in Directory.GetFiles(subDirectory, ext)) 
         { 
          musicFound.Add(subSong); 
         } 
        } 
       } 
      } 
     } 
    } 

非常感謝:)

回答

2

到目前爲止,以確保您可以訪問文件系統對象的最簡單的方法是試圖訪問它。如果它失敗並出現拒絕訪問錯誤,那麼您無權訪問。只要檢測到錯誤情況並繼續搜索下一個項目。

換句話說,委託人檢查對系統的訪問權,畢竟是訪問權的最終仲裁者。

+0

+1; @Jonathan:異常處理('try' /'catch')應該保留用於特殊情況,除非您使用的API不提供其他選項。儘可能使用狀態檢查或「嘗試」變體。雖然('GetAccessControl'),我在這裏看不到方便的一個。所以你可能會被一個異常處理程序困住。但要確保你捕獲'UnauthorizedAccessException'(或者引發任何特定的異常),而不是基類'Exception'類。 –

+1

@Merlyn你關於'try/catch'的觀點是有效的,但它絕對不應該覆蓋behvaiour的正確性。避免使用'try/catch'並實現你自己的權限檢查代碼可能會讓你很高興不使用正常行爲的異常,但是當你的程序表現不佳時,這並不是一種安慰。另外,在我的回答中,我提到檢測錯誤而不是例外。良好的文件處理API應該提供TryXXX變體。 –

+0

我完全同意。當你有一個現有的檢查方法,並且你可以確信它捕獲了你感興趣的案例時,我的觀點就會成立。如果你不能得到足夠的信任的代碼,一個異常處理器加上一個註釋說明爲什麼你吞嚥異常肯定是爲了。 –

1

您可以通過替換寫入讀取權限來檢查this問題。另外,將代碼封裝在try catch塊中,並且如果引發異常,則可以假設(或者正確檢查異常類型以確保該目錄不能被遍歷)。

+0

+1;很好的參考。但是,這很困難,因爲他們推薦的方法似乎被標記爲「Obsolete」('SecurityManager.IsGranted')。另請參閱David關於異常處理的回答下的註釋 - 你沒有錯:) –

+0

正確 - 我有一個強大的Python背景,你可能知道'請求原諒而不是權限'的想法:)所以捕捉錯誤通常成爲的流程 - 當然,如果有TrySomething方法,它們在.NET中總是更好,然後對Catch異常進行測試並不是推薦的方法/最佳實踐。 – leon