Python 标准库 os 的 walk() 方法使用起来比较方便。一是 walk() 方法自动遍历子文件夹,二是方法的返回值为 tuple 类型,包含三项信息: 当前的文件夹名称、包含的文件夹、包含的文件。简单的遍历可以是这样的:
import os
for item in os.walk(r"C:/Users/StoneWM/Downloads/"):
print (item)
如果想获得文件夹下所有文件,包括子文件夹:
import os
all_files = []
for (dir, dirs, files) in os.walk(r"C:/Users/StoneWM/Downloads/"):
for f in files:
all_files.append(f)
for f in all_files:
print(f)
获取所有文件,使用绝对路径:
import os
all_files = []
for (dir, dirs, files) in os.walk(r"C:/Users/StoneWM/Downloads/"):
for f in files:
full_path = os.path.normpath(os.path.join(dir, f))
all_files.append(full_path)
for f in all_files:
print(f)
仿照 python 的 walk() 方法,在 c# 中做了一个简单的实现:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace Stone.Common.File {
public class FileUtils {
private static List<Tuple<String, DirectoryInfo[], FileInfo[]>> dirInfo
= new List<Tuple<String, DirectoryInfo[], FileInfo[]>>();
/// <summary>
/// 递归获取文件夹下面的子文件夹和所有文件(类似Python的walk方法)
/// </summary>
/// <param name="rootPath">根目录的完整路径</param>
/// <returns>返回一个包含Tuple的List,tuple第一项:根目录名,第二项:包含的文件夹,第三项:包含的文件</returns>
public static List<Tuple<String, DirectoryInfo[], FileInfo[]>> Walk(String rootPath) {
var root = new DirectoryInfo(rootPath);
var directories = root.GetDirectories();
var files = root.GetFiles();
var currentDirInfo
= Tuple.Create<String, DirectoryInfo[], FileInfo[]>(root.FullName, directories, files);
dirInfo.Add(currentDirInfo);
// 递归调用子文件夹
foreach (var dir in directories) {
Walk(dir.FullName);
}
return dirInfo;
}
}
}
单元测试一下。获取文件夹下所有的文件名(不包括路径):
[TestMethod]
public void TestWalk_ListAllFiles() {
var files = new List<FileInfo>();
foreach(var item in FileUtils.Walk(@"C:\Users\StoneWM\Downloads\")) {
foreach(var f in item.Item3) {
files.Add(f);
}
}
foreach(var item in files) {
Console.WriteLine(item);
}
}
获取文件夹下所有文件,使用文件的完整路径:
public void TestWalk_ListAllFiles_FullPath() {
var files = new List<FileInfo>();
foreach (var item in FileUtils.Walk(@"C:\Users\StoneWM\Downloads\")) {
foreach (var f in item.Item3) {
files.Add(new FileInfo(item.Item1 + f));
}
}
foreach (var item in files) {
Console.WriteLine(item);
}
}