【问题标题】:How to check if Directory is Accessable without catching System.UnauthorizedAccessException如何在不捕获 System.UnauthorizedAccessException 的情况下检查目录是否可访问
【发布时间】:2012-07-18 13:38:17
【问题描述】:

我已经通过网络搜索和搜索,但找不到解决这个问题的好方法。

这是我的代码:

protected bool isFileValid(FileSystemInfo ifo)
{
   if (!ifo.Exists || ifo.Name.StartsWith("$") || ifo.Name.Equals("System Volume Information"))
        return false;
   if(ifo is DirectoryInfo){
        try
        {
           ((DirectoryInfo)ifo).GetFileSystemInfos();
        }
        catch (Exception e) { LogUtil.Debug("Exception in isFileValid" + e.Message); return false; }
   }
   return true;
}

除了尝试捕获异常之外,还有什么方法可以检查我是否可以访问目录?这种方法的问题是,如果有很多我无法访问的目录,它会变得非常慢。

我所说的“访问目录”是指GetFileSystemInfos() 的调用,无一例外。我的应用程序为每个FileSystemInfo 调用isFileValid,以确定它是否可以按照我描述的方式访问。

提前感谢您提供解决此问题的任何想法。

【问题讨论】:

    标签: .net directory access-violation


    【解决方案1】:

    您可以尝试查看 DirectoryInfo.Exists 属性 (documentation link)

    如果尝试执行任何错误,Exists 属性将返回 false 判断指定文件是否存在。这可能发生在某些情况下 引发异常,例如传递无效的文件名 字符或太多字符,磁盘故障或丢失,或 如果 调用者没有读取文件的权限。

    (强调的是我的)。

    下面是一个简单的例子:

    var di = (DirectoryInfo)ifo;
    if(di.Exists)
    {
        di.GetFileSystemInfos();
    }
    

    编辑:听起来你有环境变量在起作用。在调用此方法之前的某个地方,我猜您从文件路径创建FileSystemInfo,并存储在字符串中。你需要像这样扩展它:

    string expandedFilePath = Environment.ExpandEnvironmentVariables(filePath);
    

    在创建 FileSystemInfo 之前。

    http://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx

    【讨论】:

    • 感谢您的回答,但遗憾的是它不起作用:/ 在我发布的代码中,我已经检查了 ifo.Exists 是否为 false。但即使它是true,尝试在“%USER%\Application Data”之类的目录上调用GetFileSystemInfos 时也会出现异常(我还尝试在调用@ 之前将FileSystemInfo 转换为DirectoryInfo 987654334@)
    • @user1531730 抱歉,在您的代码中没有看到!你没有提到你从哪里得到这些,但看起来它是基于环境变量的!我会补充一点我的答案。
    • @user1531730 我添加了一些可能会有所帮助的内容。可能值得将失败的示例文件路径添加到原始问题!
    • 不,我不使用环境变量。我的 FileSystemInfos 就像我已经写过的一样,是通过调用父目录 GetFileSystemInfos 创建的。只有“根”目录信息是用字符串构造函数创建的,而且这个不包含环境变量。除了简单地尝试并捕获异常之外,必须有一种方法来检查 Directoy 上的 GetFileSystemInfos 调用是否有效。但这似乎不是一件容易的事:(
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 2012-02-13
    • 2018-09-22
    • 2014-05-02
    • 2012-03-04
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多