2012-10-28 30 views
0

我使用以下代码Directory.EnumeratedDirectorties在执行前被推迟了吗?

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

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

,下面的代码是,本身不看目录等,它只是一个字符串循环:

foreach (string folder in StringList) 
{ 
     /dostuff 
} 

然而,当我更新使用allFolderPaths(可根据在第一个例子的代码这篇文章)

foreach (string folder in allFolderPaths) 
{ 
     /dostuff 
} 

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

那么,这是否意味着变量allFolderPaths实际上并没有被分配给它(如果这有什么意义)?

回答

2

Directory.EnumerateFiles()返回一个IEnumerable <>只有当您实际枚举可枚举...(又名“懒惰执行”)时才执行。

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

例子:

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

的原因存取遭拒例外是,你试图枚举您没有权限来枚举目录;您正在查看“我的文档”还是类似的?

+0

哈哈,你知道你的东西;是的,这是造成这个问题的My Documents文件夹 - 这就是为什么我试图通过每个文件夹,一次一个,看看我是否有权限,如果是这样,将它添加到HavePermisionsList – Dave

+0

你有没有这是一个解决方案吗? – Dave

+1

问题文件夹是'假'文件夹:即'我的图片','我的音乐'等我做了一个'SafeEnumerateDirectory'函数,它将捕获异常。来源https://gist.github.com/3972045 – Grynn

1

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

1

代码中的allFolderPaths变量的类型为IEnumerable<string>。这确实意味着只有使用foreach循环对其进行枚举时,才会访问该磁盘。

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

“访问被拒绝”异常很有可能,特别是当您迭代驱动器的根目录时。即使是管理员也无法访问“系统卷信息”文件夹。你需要捕捉这个异常并继续。避免它们的一个好方法是使用DirectoryInfo.Attributes。如果目录是隐藏的和系统的,那么你几乎总是想从这样的目录中清除。

+0

这是我想我必须避免的;看起来try catch并不是一件好事,应该只是更多地被用作'try-catch - 尝试别的东西'......但是,我可以使用catch来压制消息并转到下一步目录!它肯定会起作用,但是,那是什么意思? – Dave

+1

你有使用try/catch和允许机器上的另一个进程随机崩溃你的程序的基本选择。后者绝不是错误的事情,你可以责怪另一个过程。 –