可靠目录.使用 C# 存在
本文关键字:存在 使用 | 更新日期: 2023-09-27 18:35:31
根据这篇 MSDN 文章,Directory.Exists 可以返回漏报(目录存在,但您无法读取它或类似内容)。我想知道是否有类似的方法,而不是返回真或假,返回更多信息更丰富的东西......比如"访问被拒绝"或"路径太长"......
您可以尝试创建一个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。