[英]How to iterate through and read values in an ArrayList of ArrayLists of objects in C#?
[英]How to iterate through the physical folders and read a leaf file in C#
我有一个根节点A,其中的B包含C,C包含C,D包含一个XML文件abc.xml因此,在D:\\ drive中,我具有目录A >> B >> C >> D的以下结构。 此路径是动态的。 通过遍历物理文件夹读取C#中的abc.xml文件的最佳实践是什么?
您可以实现一个递归搜索算法,该算法遍历所有文件夹,然后进入子文件夹。
伪代码:
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
与SearchOption.AllDirectories
一起SearchOption.AllDirectories
。
我为什么要编写递归算法:OP询问如何在叶子目录中找到所有XML文件。 您不能使用带有SearchOption.AllDirectories
Directory.GetFiles
来执行此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>());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.