3

成员函数DirectoryInfo::EnumerateFiles只能抛出DirectoryNotFoundException并且SecurityException

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

为什么?

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

4

3 回答 3

2

原因在于它们的使用方式。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");

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

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

  • 嘿,我加载的那个目录 - 为我枚举它上面的文件。

myObject.EnumerateFiles();

由于它已经加载了该文件夹,因此无需再次执行此操作,因为它知道它正在工作并且完全没问题。没有找到唯一的可能性(如果在这两行之间,您删除了计算机上的文件夹)和 SecurityException,即您没有枚举权限。

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

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

关于 PathTooLongException 的一些信息:

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

但是,根本不可能将文件放在文件夹中 - windows 给出错误:

文件名对于目标文件夹来说太长了。

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

于 2013-07-19T12:43:14.937 回答
1

静态Directory方法需要目录路径的参数,而这些DirectoryInfo方法是已创建DirectoryInfo对象的实例方法。因此,当您调用它的方法时,该Directory方法可能会引入这些DirectoryInfo方法不再存在的问题,例如:

  • 参数异常
  • 参数NullException
  • DirectoryNotFoundException
  • 路径过长异常

但是,如果您查看构造函数,DirectoryInfo您会发现这些可能的问题已经在那里处理了。

于 2013-07-19T12:46:00.173 回答
0

它可以抛出更多异常,因为它在一次调用中处理用于执行它的对象的构造和销毁。

在 C# 中迭代​​目录中的文件时处理异常的最佳方法是什么?

你如何处理它们取决于你,但除非异常对你有特别的意义,并且你会因为它做一些不同的事情,否则就这样做:

try
{
    ...
}
catch (Exception ex)
{
    ...
}

这将抓住所有的人。

如果你想处理它们中的每一个,它看起来像这样:

try
{
}
catch (DirectoryNotFoundException ex)
{
}
catch (SecurityException ex)
{
}
etc...
于 2013-07-19T12:40:41.577 回答