原因在于它们的使用方式。DirectoryInfo::EnumerateFiles
在当前目录上工作,因此就其性质而言,将目录加载到对象中的工作已经完成 - 担心路径太长等是由DirectoryInfo
对象的构造完成的,例如:
DirectoryInfo di = new DirectoryInfo(...); // Gets the directory - many things could go wrong here
di.EnumerateFiles(); // Since we have a DirectoryInfo object, we already know the directory is ok - we've checked for the other problems already.
Directory.EnumerateFiles
是一个静态方法,这意味着它不适用于已成功创建的现有对象。因此它必须加载目录(这可能导致任意数量的异常),然后枚举文件。
它本质上是将前两个步骤合二为一。
用英语看它的另一种方式是:
DirectoryInfo myObject = new DirectoryInfo(@"C:\myfolder");
如果它无效,例如。因为路径太长,你会在这里得到一个异常。
如果它有效,它现在将有关目录的信息加载到对象中。所以你可以说
myObject.EnumerateFiles();
由于它已经加载了该文件夹,因此无需再次执行此操作,因为它知道它正在工作并且完全没问题。没有找到唯一的可能性(如果在这两行之间,您删除了计算机上的文件夹)和 SecurityException,即您没有枚举权限。
另一个示例结合了这两个步骤,并说“为我枚举此文件夹中的所有文件”
因此它将加载文件夹(这可能会生成所有这些异常),然后枚举文件,所有这些都在一个步骤中完成。
关于 PathTooLongException 的一些信息:
包含完整路径的文件的最大长度为 260 个字符。因此,如果您有一个像 c:\aaaaaaaaaaaaaaaaa...... 这样的文件夹,长度为 250 个字符,您可能会认为将一个长度为 20 个字符的文件放入文件夹(总共 270 个字符)会导致 DirectoryInfo 抛出一个例外。
但是,根本不可能将文件放在文件夹中 - windows 给出错误:
文件名对于目标文件夹来说太长了。
因此,DirectoryInfo.EnumerateFiles 不可能被欺骗超过 260 的最大长度,因为不可能创建超过 260 个字符的长度。