0

我正在使用以下代码

var allFolderPaths = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories);

我遇到的问题是在 foreach 循环期间(迭代 allFolderPaths 变量,如上所示),它失败了,因为找不到目录。

现在,以下代码本身不查看目录等,它只是一个字符串循环:

foreach (string folder in StringList)
{
       /dostuff 
}

但是,当我更新代码以使用 allFolderPaths 时(根据本文中的第一个示例)

foreach (string folder in allFolderPaths)
{
       /dostuff 
}

由于“访问路径被拒绝”而失败!

那么,这是否意味着变量 allFolderPaths 在分配给它时实际上并未“分配”(如果这有意义的话)?

4

3 回答 3

2

Directory.EnumerateFiles() 返回一个 IEnumerable<>,它仅在您实际枚举可枚举...(又名“延迟执行”)时“执行”。

如果你想强制 EnumerateFiles 立即执行,你可以添加一个 .ToList() (又名“memoization”)。

例子:

  var allFolders = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories).ToList();

AccessDenied 异常的原因是您试图枚举一个您无权枚举的目录;您是否正在查看“我的文档”或类似内容?

于 2012-10-28T14:10:28.053 回答
1

代码中的 allFolderPaths 变量属于IEnumerable<string>. 这确实意味着在您开始使用 foreach 循环枚举磁盘之前,您不会访问磁盘。

在这种情况下“找不到目录”异常是不太可能的,因为它的名称是在一毫秒前检索到的。但并非完全不可能,文件系统可以在其他进程访问磁盘时即时更改。

极有可能出现“拒绝访问”异常,尤其是在您迭代驱动器的根目录时。即使管理员也无法访问“系统卷信息”文件夹。您需要捕获此异常并继续。避免它们的一个好方法是使用 DirectoryInfo.Attributes。如果目录是隐藏和系统,那么您几乎总是希望避开这样的目录。

于 2012-10-28T14:16:21.557 回答
1

不,这意味着您的进程正在尝试访问它没有权限的文件/目录。

于 2012-10-28T14:06:27.437 回答