Mar*_*ell 412
请注意,在.NET 4.0中,存在(假设)基于迭代器(而不是基于数组)的文件函数:
foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
{
Console.WriteLine(file);
}
Run Code Online (Sandbox Code Playgroud)
目前我会使用下面的东西; 如果您无法访问单个子目录,则内置递归方法会很容易中断...; 的Queue<string>使用避免了过多的调用堆栈递归和迭代器块避免了一个巨大的数组我们.
static void Main() {
foreach (string file in GetFiles(SOME_PATH)) {
Console.WriteLine(file);
}
}
static IEnumerable<string> GetFiles(string path) {
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0) {
path = queue.Dequeue();
try {
foreach (string subDir in Directory.GetDirectories(path)) {
queue.Enqueue(subDir);
}
}
catch(Exception ex) {
Console.Error.WriteLine(ex);
}
string[] files = null;
try {
files = Directory.GetFiles(path);
}
catch (Exception ex) {
Console.Error.WriteLine(ex);
}
if (files != null) {
for(int i = 0 ; i < files.Length ; i++) {
yield return files[i];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*n T 180
该文章涵盖了所有你需要的.除了搜索文件和比较名称外,只需打印出名称即可.
它可以像这样修改:
static void DirSearch(string sDir)
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d))
{
Console.WriteLine(f);
}
DirSearch(d);
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 88
Directory.GetFiles("C:\\", "*.*", SearchOption.AllDirectories)
Run Code Online (Sandbox Code Playgroud)
Vik*_*kov 17
最短记录
string files = Directory.GetFiles(@"your_path", "*.jpg", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)
Joh*_*ter 12
至少在.NET 4.5中,这个版本要短得多,并且还有额外的好处,可以评估包含在列表中的任何文件条件:
/// </remarks>
public static IEnumerable<string> GetAllFiles(string path, Func<FileInfo, bool> checkFile = null)
{
string mask = Path.GetFileName(path);
if (string.IsNullOrEmpty(mask))
mask = "*.*";
path = Path.GetDirectoryName(path);
string[] files = Directory.GetFiles(path, mask, SearchOption.AllDirectories);
foreach (string file in files)
{
if (checkFile == null || checkFile(new FileInfo(file)))
yield return file;
}
}
Run Code Online (Sandbox Code Playgroud)
使用如下:
string folder = Config.TestInput();
string mask = folder + "*.*";
var list = UT.GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();
Assert.AreNotEqual(0, list.Count);
var lastQuarter = DateTime.Now.AddMonths(-3);
list = UT.GetAllFiles(mask, (info) => info.CreationTime >= lastQuarter).ToList();
Assert.AreNotEqual(0, list.Count);
Run Code Online (Sandbox Code Playgroud)
Raz*_*dze 11
IEnumerable<string> GetFilesFromDir(string dir) =>
Directory.EnumerateFiles(dir).Concat(
Directory.EnumerateDirectories(dir)
.SelectMany(subdir => GetFilesFromDir(subdir)));
Run Code Online (Sandbox Code Playgroud)
小智 5
这是我们如何获取文件作为其子目录的 FileInfo 的方法,
var dir = new DirectoryInfo(rootPath);
FileInfo[] files = dir.GetFiles("*.*", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)