我有以下代码通过目录递归搜索文件,该目录向我返回了所有xml文件的列表。除了根目录中的xml文件未包含在列表中之外,所有其他方法都运行良好。
我知道为什么,因为这样做的第一件事是获取根目录中的目录,然后获取文件,从而丢失了根目录中的GetFiles()调用。我尝试在foreach之前包含GetFiles()调用,但是结果不符合我的预期。
public static ArrayList DirSearch(string sDir) { try { foreach (string d in Directory.GetDirectories(sDir)) { foreach (string f in Directory.GetFiles(d, "*.xml")) { string extension = Path.GetExtension(f); if (extension != null && (extension.Equals(".xml"))) { fileList.Add(f); } } DirSearch(d); } } catch (Exception ex) { Console.WriteLine(ex.Message); } return fileList; }
我的目录结构是这样的:
RootDirectory test1.0.xml test1.1.xml test1.2.xml 2ndLevDir test2.0.xml test2.1.xml 3rdLevDir test3.0.xml test3.1.xml
代码返回:
test2.0.xml test2.1.xml test3.0.xml test3.1.xml
我想返回每个文件,包括:
test1.0.xml test1.1.xml test1.2.xml
没有很好的诗歌与递归。任何指针将不胜感激。
您可以使用Directory.GetFiles的此重载为您搜索子目录,例如:
string[] files = Directory.GetFiles(sDir, "*.xml", SearchOption.AllDirectories);
只能像这样搜索一个扩展名,但是您可以使用如下代码:
var extensions = new List<string> { ".txt", ".xml" }; string[] files = Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories) .Where(f => extensions.IndexOf(Path.GetExtension(f)) >= 0).ToArray();
选择具有所需扩展名的文件(扩展名区分大小写的NB)。
在某些情况下,可能希望使用Directory.EnumerateFiles方法枚举文件:
foreach(string f in Directory.EnumerateFiles(sDir, "*.xml", SearchOption.AllDirectories)) { // do something }
请查阅文档以获取可能引发的异常,例如,如果代码在没有适当访问权限的帐户下运行,则抛出UnauthorizedAccessException。