我有以下代码通过目录递归搜索文件,该目录返回所有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;
}
Run Code Online (Sandbox Code Playgroud)
我的目录结构类似于:
RootDirectory
test1.0.xml
test1.1.xml
test1.2.xml
2ndLevDir
test2.0.xml
test2.1.xml
3rdLevDir
test3.0.xml
test3.1.xml
Run Code Online (Sandbox Code Playgroud)
代码返回:
test2.0.xml
test2.1.xml
test3.0.xml
test3.1.xml
Run Code Online (Sandbox Code Playgroud)
我想返回每个文件,包括:
test1.0.xml
test1.1.xml
test1.2.xml
Run Code Online (Sandbox Code Playgroud)
不太适用于递归.任何指针都将非常感激.
And*_*ton 110
您可以使用Directory.GetFiles的这个重载来搜索子目录,例如:
string[] files = Directory.GetFiles(sDir, "*.xml", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)
只能搜索一个扩展名,但您可以使用以下内容:
var extensions = new List<string> { ".txt", ".xml" };
string[] files = Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories)
.Where(f => extensions.IndexOf(Path.GetExtension(f)) >= 0).ToArray();
Run Code Online (Sandbox Code Playgroud)
选择具有所需扩展名的文件(对于扩展名区分大小写的NB).
在某些情况下,可能需要使用Directory.EnumerateFiles方法枚举文件:
foreach(string f in Directory.EnumerateFiles(sDir, "*.xml", SearchOption.AllDirectories))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
如果代码在没有适当访问权限的帐户下运行,请查阅文档以了解可抛出的异常,例如UnauthorizedAccessException.
Tim*_*ter 49
这将递归返回所有xml文件:
var allFiles = Directory.GetFiles(path, "*.xml", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)