我想要x深度的所有文件夹和文件的列表。
如果x是2,那么我将获得第一个文件夹中的所有文件夹和文件的信息,以及第一个文件夹的所有文件夹或文件的信息。
如何做到这一点?
此代码将执行其他答案正在执行的操作,但也会返回文件夹名称(因为这似乎是您询问的内容的一部分)。这需要.Net 4.0。如果您希望跟踪哪些是文件夹,哪些是文件,您可以返回一个包含文件列表和文件夹列表的元组。
List<string> GetFilesAndFolders(string root, int depth)
{
var list = new List<string>();
foreach(var directory in Directory.EnumerateDirectories(root))
{
list.Add(directory);
if (depth > 0)
{
list.AddRange(GetFilesAndFolders(directory, depth-1));
}
}
list.AddRange(Directory.EnumerateFiles(root));
return list;
}
EDIT:保持文件夹和文件独立的代码
Tuple<List<string>,List<string>> GetFilesAndFolders(string root, int depth)
{
var folders = new List<string>();
var files = new List<string>();
foreach(var directory in Directory.EnumerateDirectories(root))
{
folders.Add(directory);
if (depth > 0)
{
var result = GetFilesAndFolders(directory, depth-1);
folders.AddRange(result.Item1);
files.AddRange(result.Item2);
}
}
files.AddRange(Directory.EnumerateFiles(root));
return new Tuple<List<string>,List<string>>(folders, files);
}
我觉得这个问题以前好像已经解决了。基本上,你想做的是询问当前文件是否是一个目录,如果为true,并且x还没有达到最大值,还没有获取该文件的子目录。此外,您还需要检查该目录中是否存在文件,并检索它们。
如果您只想要文件名,可以使用递归方法。类似的东西:(没有保证完全正确,我在没有编译器的情况下写作)
public static List<String> GetSubfoldersAndFiles(DirectoryInfo di, int deep)
{
List<string> myContent = new List<string>();
foreach(FileInfo fi in di.GetFiles())
{
myContent.Add(fi.FullName);
}
if(deep > 0)
{
foreach(DirectoryInfo subDi in di.GetDirectories())
{
myContent.AddRange(GetSubfoldersAndFiles(subDi, deep - 1).ToArray());
}
}
return myContent;
}
通话内容如下:
List<string> content = GetSubfoldersAndFiles(new DirectoryInfo(@"c:", 3));
所有子文件夹
public List<string> listDir(string pPath)
{
List<string> dirList = new List<string>();
listDir(pPath, dirList);
return dirList;
}
private void listDir(string pPath, List<string> pList)
{
string[] loDirs = System.IO.Directory.GetDirectories(pPath);
foreach (string loDir in loDirs)
{
pList.Add(loDir);
listDir(loDir, pList);
}
}
扩展@pstrjds应答
private static IReadOnlyList<string> SearchFiles(string root, string pattern = "*", int depth = 1, params string[] exceptFolders)
{
var files = Directory
.EnumerateDirectories(root)
.Where(it => !exceptFolders.Contains(Path.GetRelativePath(root, it)) && depth > 0)
.SelectMany(it => SearchFiles(it, pattern, depth - 1, exceptFolders))
.ToList();
files.AddRange(Directory.EnumerateFiles(root, pattern));
return files;
}