2014-12-29 26 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。”