C# 可靠目录。使用C存在#

C# 可靠目录。使用C存在#,c#,io,directory,C#,Io,Directory,根据,Directory.Exists可以返回假阴性(该目录存在,但您无法读取它或类似内容)。我想知道是否有一种类似的方法,它不是返回true或false,而是返回一些更有用的信息。。。例如“拒绝访问”或“路径太长”…您可以尝试创建一个对象。如果路径无效或用户无权访问,则构造函数应引发异常。不过,您仍然需要检查它是否存在 try { var di = new DirectoryInfo(path); if(di.Exists) { //The direct

根据,Directory.Exists可以返回假阴性(该目录存在,但您无法读取它或类似内容)。我想知道是否有一种类似的方法,它不是返回true或false,而是返回一些更有用的信息。。。例如“拒绝访问”或“路径太长”…

您可以尝试创建一个对象。如果路径无效或用户无权访问,则构造函数应引发异常。不过,您仍然需要检查它是否存在

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.
}

有一个
目录.GetAccessControl()
方法,可用于获取可列出但不可读的目录:

public static bool DirectoryVisible(string path)
{
    try
    {
        Directory.GetAccessControl(path);
        return true;
    }
    catch (UnauthorizedAccessException)
    {
        return true;
    }
    catch
    {
        return false;
    }
}
您还可以使用
DirectoryInfo
类。它带有
存在
属性和
属性
属性。如果在访问
属性
属性时引发
UnauthorizedAccess异常
,则表示无法访问目录。

此代码可以区分文件是否确实存在,以及文件是否存在但用户没有访问权限

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函数返回错误值,即0xFFFFFF或-1

如果路径存在但不允许访问,则尝试检索属性将引发异常


如果路径不存在,那么属性将为-1。”

我认为
DirectoryInfo
构造函数不会对不存在或您无权访问的路径抛出异常。至少,在我刚刚运行的快速测试中没有。哦,但我现在明白了,你说的是一条真正无效的路径,而不是一条不存在的路径。那么OP的测试有什么好处呢?@adv12请查看MSDN文档的链接。你仍然需要检查它是否如我所说的那样存在。哦,我看到OP想要捕获错误,比如“路径太长”,这会被构造函数捕获。