2014-12-29 23 views
0

根據this MSDN article,Directory.Exists可以返回錯誤的否定結果(該目錄存在,但不能讀取或類似)。我想知道是否有類似的方法,而不是返回真或假,返回更多的信息.​​..像「訪問被拒絕」或「路徑太長」...可靠的Directory.Exists using C#

回答

1

你可以嘗試創建一個DirectoryInfo對象。如果路徑無效或用戶無權訪問,構造函數應該會引發異常。你仍然需要檢查它是否存在。

try 
{ 
    var di = new DirectoryInfo(path); 
    if(di.Exists) 
    { 
     //The directory exists 
    } 
    else 
    { 
     //The path is valid, but does not exist. 
    } 
} 
catch(Exception e) 
{ 
    //The path is invalid or user does not have access. 
} 
+0

我不認爲這是真的,'DirectoryInfo'構造函數拋出的異常的不存在或您穿上」路徑至少,它並沒有在我剛剛跑過的一個快速測試中,噢,但我現在看到你說的是一條真正無效的路徑,而不是一條不存在的路徑,但那麼測試有什麼好處對於OP? – adv12

+0

@ adv12檢查MSDN文檔的鏈接,你仍然需要檢查它是否存在,正如我提到的 – juharr

+0

哦,我發現OP想要捕獲像「path too long」這樣的錯誤,由該構造函數。 – adv12

1

有一個Directory.GetAccessControl()方法,你可以用它來獲得可列,但無法讀取目錄:

public static bool DirectoryVisible(string path) 
{ 
    try 
    { 
     Directory.GetAccessControl(path); 
     return true; 
    } 
    catch (UnauthorizedAccessException) 
    { 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

您也可以利用DirectoryInfo類。它配備了Exists財產和Attributes財產。如果在訪問Attributes屬性時拋出了UnauthorizedAccessException,則表示您無法訪問該目錄。

0

source

這個代碼可以,如果一個文件實際上存在區分,而如果該文件,但用戶不能訪問從源頭

enum ExistState { exist, notExist, inaccessible }; 

void Check(string name) { 
    DirectoryInfo di = new DirectoryInfo(name); 
    ExistState state = ExistState.exist; 
    if (!di.Exists) { 
     try { 
      if ((int)di.Attributes == -1) { 
       state = ExistState.notExist; 
      } 
     } catch (UnauthorizedAccessException) { 
      state = ExistState.inaccessible; 
     } 
    } 
    Console.WriteLine("{0} {1}", name, state); 
} 

解釋
「的DirectoryInfo.Attributes屬性記錄不正確,並且不會引發FileNotFound或DirectoryNotFound異常,而是從基礎win api函數返回錯誤值,該值爲0xFFFFFFFF或-1。

如果路徑存在但訪問不被允許,則嘗試檢索屬性將引發異常。

如果路徑不存在,那麼該屬性將是-1。」