c# - 为什么 Directory::EnumerateFiles 和 DirectoryInfo::EnumerateFiles 抛出不同的异常?

标签 c# .net exception

成员函数DirectoryInfo::EnumerateFiles只能抛出 DirectoryNotFoundExceptionSecurityException

而静态函数 Directory::EnumerateFiles可以抛出相同的异常以及许多其他异常,如 PathTooLongExceptionUnauthorizedAccessExceptionIOException

为什么?

我需要编写健壮的代码。 在 C# 中迭代​​目录中的文件时处理异常的最佳方法是什么?

最佳答案

原因在于它们的使用方式。 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 是一种静态方法,这意味着它不适用于已成功创建的现有对象。因此它必须加载目录(这可能会导致任意数量的异常),然后枚举文件。

它本质上是将前两个步骤合二为一。

另一种看待它的方式,用英语是:

  • 为我将此目录加载到一个对象中 c:\myfolder

DirectoryInfo myObject = new DirectoryInfo(@"C:\myfolder");

如果它无效,例如。因为路径太长,你会在这里得到一个异常(exception)。

如果成功,它现在会将有关目录的信息加载到对象中。所以你可以说

  • 嘿,我加载的那个目录 - 为我枚举其中的文件。

myObject.EnumerateFiles();

因为它已经加载了文件夹,所以不需要再次加载,因为它知道它正在工作并且完全正常。唯一的可能是没有找到(如果在这两行之间,你删除了你计算机上的文件夹)和一个 SecurityException,这是你没有权限枚举。

另一个例子结合了这两个步骤,并说“为我枚举这个文件夹中的所有文件”

因此它将加载文件夹(这可能会生成所有这些异常),然后枚举文件,所有这些都在一个步骤中完成。

关于 PathTooLongException 的一些信息:

文件的最大长度(包括完整路径)为 260 个字符。因此,如果您有一个像 c:\aaaaaaaaaaaaaaaaa 这样的文件夹,它有 250 个字符长,您可能会认为将一个 20 个字符长的文件放入该文件夹(总共 270 个)会导致 DirectoryInfo 抛出一个异常(exception)。

然而,根本不可能将文件放入文件夹中 - Windows 给出错误:

The file name(s) would be too long for the destination folder.

因此,DirectoryInfo.EnumerateFiles 不可能被欺骗超过最大长度 260,因为不可能创建超过 260 个字符的任何内容。

关于c# - 为什么 Directory::EnumerateFiles 和 DirectoryInfo::EnumerateFiles 抛出不同的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17746274/

相关文章:

c# - 这是在方法和类上创建和使用自定义属性的正确方法吗?

c++ - 为什么GCC执行1/0会报Floating Point Exception?

java - Spring MQTT : catch ConnectException

C# 从另一个线程调用 form.show()

c# - 具有继承变化的DataContract

c# - 图像不显示与 asp.net 转发器

.net - .net iis无法加载文件汇编

c# - 查找文件夹中的所有文件

c# - 带字符串组标题的 LongListSelector

python - Python 中是否有 raise foo, bar 的用例?