Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Directory.EnumeratedDirectory是否在执行前延迟?_C# - Fatal编程技术网

C# Directory.EnumeratedDirectory是否在执行前延迟?

C# Directory.EnumeratedDirectory是否在执行前延迟?,c#,C#,我正在使用以下代码 var allfolderpath=Directory.EnumerateDirectories(this.sourceFolder,“*.*”,SearchOption.AllDirectories) 我遇到的问题是,在foreach循环期间(如上所示迭代allFolderPaths变量),它失败了,因为找不到目录 现在,以下代码本身并不查看目录等,它只是一个字符串循环: foreach (string folder in StringList) { /dos

我正在使用以下代码

var allfolderpath=Directory.EnumerateDirectories(this.sourceFolder,“*.*”,SearchOption.AllDirectories)

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

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

foreach (string folder in StringList)
{
       /dostuff 
}
但是,当我更新代码以使用AllFolderPath时(根据本文中的第一个示例)

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


那么,这是否意味着变量AllFolderPath在其被分配到的点上实际上没有被“分配”(如果有意义的话)?

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

否,这意味着您的进程正试图访问其无权访问的文件/目录。

目录。EnumerateFiles()返回一个IEnumerable,该IEnumerable仅在您实际枚举可枚举的…(也称为“延迟执行”)时才“执行”

如果要强制立即执行枚举文件,可以添加.ToList()(也称为“备忘录”)

例如:

  var allFolders = Directory.EnumerateDirectories(this.sourceFolder, "*.*", SearchOption.AllDirectories).ToList();
AccessDenied异常的原因是您试图枚举一个您没有权限枚举的目录;您正在查找“我的文档”或类似内容吗?

目录。EnumerateFiles()返回一个IEnumerable,该IEnumerable仅在您实际枚举可枚举的…(也称为“延迟执行”)时才被“执行”

如果要强制立即执行枚举文件,可以添加.ToList()(也称为“备忘录”)

例如:

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

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

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

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


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

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

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


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

Ha,你知道你的东西;是的,是“我的文档”文件夹导致了问题-这就是为什么我试图逐个检查每个文件夹,看看我是否有权限,如果有,请将其添加到“有权限”文件夹中。您是否有解决方案?问题文件夹是“假”文件夹:即“我的图片”,“我的音乐”等。我制作了一个“SafeEnumerateDirectory”函数,可以捕捉异常。这里的源代码感谢您——我看到的所有解决方案都使用catch来“抑制”错误消息并移动到迭代中的下一项,这很有趣。这应该是一个糟糕的做法,但实际上,这似乎是唯一有效的方法!通过使用与FindFirstFile()、FindTextFile()的互操作,可以绕过try/catch。。。在内部,这就是Directory.EnumerateFiles在任何情况下所做的工作。然而,在这种情况下,速度的提高是不值得的,因为你真正受IO时间而不是CPU时间的限制;是的,是“我的文档”文件夹导致了问题-这就是为什么我试图逐个检查每个文件夹,看看我是否有权限,如果有,请将其添加到“有权限”文件夹中。您是否有解决方案?问题文件夹是“假”文件夹:即“我的图片”,“我的音乐”等。我制作了一个“SafeEnumerateDirectory”函数,可以捕捉异常。这里的源代码感谢您——我看到的所有解决方案都使用catch来“抑制”错误消息并移动到迭代中的下一项,这很有趣。这应该是一个糟糕的做法,但实际上,这似乎是唯一有效的方法!通过使用与FindFirstFile()、FindTextFile()的互操作,可以绕过try/catch。。。在内部,这就是Directory.EnumerateFiles在任何情况下所做的工作。然而,在这种情况下,速度的提高是不值得的,因为你真的受到IO时间而不是CPU时间的限制;看来,尝试捕捉不是一件好事,应该更多地用作“尝试捕捉——尝试其他东西”。。。但是,我可以使用catch来抑制消息并转到下一个目录!它肯定会工作,但是,这就是你的意思吗?在使用try/catch和允许机器上的另一个进程随机崩溃你的程序之间,你有一个基本的选择。l