我正在使用以下代码
var allFolderPaths = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories);
我遇到的问题是,在foreach循环期间(如上所示遍历allFolderPaths变量),它失败了,因为找不到目录。
现在,以下代码本身并没有查看目录等,它只是一个字符串循环:
foreach (string folder in StringList)
{
/dostuff
}
但是,当我更新代码以使用allFolderPaths时(根据本文中的第一个示例)
foreach (string folder in allFolderPaths)
{
/dostuff
}
由于“访问路径被拒绝”而失败!
那么,这是否意味着变量allFolderPaths实际上并未在其分配的位置被“分配”(如果这有意义的话)?
答案 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,那么你几乎总是希望从这样的目录中清除。