可靠目录.使用 C# 存在

本文关键字:存在 使用 | 更新日期: 2023-09-27 18:35:31

根据这篇 MSDN 文章,Directory.Exists 可以返回漏报(目录存在,但您无法读取它或类似内容)。我想知道是否有类似的方法,而不是返回真或假,返回更多信息更丰富的东西......比如"访问被拒绝"或"路径太长"......

可靠目录.使用 C# 存在

您可以尝试创建一个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.
}

有一个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,则表示无法访问该目录。

来源

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

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。