【发布时间】:2011-09-02 18:06:53
【问题描述】:
我想列出 x 深度的所有文件夹和文件。
如果 x 为 2,我将获得有关第一个文件夹中所有文件夹和文件的信息,以及第一个文件夹中文件夹中的所有文件夹和文件的信息。
如何做到这一点?
【问题讨论】:
标签: c# .net visual-studio-2010 file directory
我想列出 x 深度的所有文件夹和文件。
如果 x 为 2,我将获得有关第一个文件夹中所有文件夹和文件的信息,以及第一个文件夹中文件夹中的所有文件夹和文件的信息。
如何做到这一点?
【问题讨论】:
标签: c# .net visual-studio-2010 file directory
此代码将执行其他答案正在执行的操作,但还会返回文件夹名称(因为这似乎是您所询问的内容的一部分)。这将需要 .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;
}
编辑:将文件夹和文件分开的代码
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);
}
【讨论】:
我觉得这个问题以前已经解决了。基本上你想要做的是询问当前文件是否是一个目录,如果它是一个目录,如果是真的并且 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));
【讨论】:
--deep 会让这个失败。避免 ++ 和 -- 的另一个原因,post 或 pre。
所有子文件夹
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;
}
【讨论】: