I have a root node A which contains B which contains C which contains D which contains an XML file abc.xml So in D:\ drive ,I have the following structure of directories A>>B>>C>>D. This path is dynamic. What is the best practice to read the file abc.xml in C# by iterating through the physical folders?
4 回答
您可以实现遍历所有文件夹并下降到子文件夹的递归搜索算法。
伪代码:
public void GetXMLFilesRecursive(string currentFolder, List<string> results)
{
// Enumerate all directories of currentFolder
string[] folders = Directory.GetDirectories(currentFolder);
foreach (string folder in folders)
GetXMLFilesRecursive(folder, results));
// Enumerate all XML files in this folder only if it has no other sub-folders (is a leaf)
if (folders.Length == 0)
{
string[] xmlFiles = Directory.GetFiles(currentFolder, "*.xml");
results.AddRange(xmlFiles);
}
}
此方法仅返回层次结构的最低文件夹(即没有子文件夹的文件夹)中的 XML 文件。如果您想要一路上找到的所有文件,请注释掉if (folders.Length == 0)
. 另一方面,您也可以使用Directory.GetFiles
with SearchOption.AllDirectories
。
为什么我要编写递归算法:OP 询问如何在叶子目录中查找所有 XML 文件。你不能使用Directory.GetFiles
with来做到这一点SearchOption.AllDirectories
,但你需要实现上述内容。
您可以使用Directory.GetFiles(d, "*.xml",SearchOption.AllDirectories)
获取所有 xml 文件来获取您要查找的内容。
您可以使用Directory.GetFiles(path,searchPattern,SearchOption)或Directory.EnumerateFiles和SearchOption.AllDirectories在整个树中搜索文件,例如
var fullPaths=Directory.GetFiles(myPath,"abc.xml",SearchOption.AllDirectories)
您还可以使用 DirectoryInfo 类来获取完整的 FileInfo 实例而不仅仅是路径,并可以访问文件属性和属性:
var myDir=new DirectoryInfo(myPath);
var fileInfos=myDir.GetFiles("abc.xml",SearchOption.AllDirectories);
GetFiles 和 EnumerateFiles 方法之间的区别在于,第一个方法返回一个包含所有找到的文件的数组,阻塞直到找到所有文件。另一方面,EnumerateFiles在找到结果时返回结果,因此您可以更快地处理结果。
GetFiles 的功能也适用于GetDirectories / EnumerateDirectories函数集。Directory 和 DirectoryInfo 类都提供这些方法。
如果要同时搜索目录和文件,可以使用GetFileSystemEntries / EnumerateFileSystemEntries通过一次调用返回它们。等效的 DirectoryInfo 方法是GetFileSystemInfos / EnumerateFileSystemInfos
public List<string> getFiles(string path, string searchPattern, List<string> list)
{
try
{
foreach (string folder in Directory.GetDirectories(path))
getFiles(folder, searchPattern, list);
list.AddRange(Directory.GetFiles(path, searchPattern));
}
catch (UnauthorizedAccessException)
{
//Do not have access to the file.
}
return list;
}
像这样调用:
//Get all xml files in the D drive:
List<string> files = getFiles(@"d:\", "*.xml", new List<string>());