Directory.EnumeratedDirectorties是否在执行前被推迟?

时间:2012-10-28 14:02:35

标签: c#

我正在使用以下代码

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

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

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

foreach (string folder in StringList)
{
       /dostuff 
}

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

foreach (string folder in allFolderPaths)
{
       /dostuff 
}

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

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

3 个答案:

答案 0 :(得分:2)

Directory.EnumerateFiles()返回IEnumerable<>只有当你实际枚举可枚举的时候才会'执行'...(又名“懒惰执行”)。

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

示例:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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