C#遍历文件夹

namespace

using System.IO;

遍历文件夹下的子文件和子文件夹

DirectoryInfo dirInfo = new DirectoryInfo(@"D:\TestDir");

// 遍历子文件
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
    Console.WriteLine(fileInfo.Name);
    Console.WriteLine(fileInfo.FullName);
    Console.WriteLine(fileInfo.Extension);
}

// 遍历子文件夹
DirectoryInfo[] subDirInfos = dirInfo.GetDirectories();
foreach (DirectoryInfo subDirInfo in subDirInfos)
{
    Console.WriteLine(subDirInfo.Name);
    Console.WriteLine(subDirInfo.FullName);
}

遍历文件夹下所有层级的文件和文件夹

DirectoryInfo dirInfo = new DirectoryInfo(@"D:\TestDir");
List<FileInfo> subFileInfos = new List<FileInfo>();
List<DirectoryInfo> subDirInfos = new List<DirectoryInfo>();
ListAllLevelSubDirAndFile(dirInfo, ref subFileInfos, ref subDirInfos);

foreach (FileInfo subFileInfo in subFileInfos)
{
    Console.WriteLine(subFileInfo.Name);
}

foreach (DirectoryInfo subDirInfo in subDirInfos)
{
    Console.WriteLine(subDirInfo.Name);
}

public static void ListAllLevelSubDirAndFile(
    DirectoryInfo dirInfo,
    ref List<FileInfo> subFileInfoList,
    ref List<DirectoryInfo> subDirInfoList)
{
    if (dirInfo == null)
    {
        return;
    }

    FileInfo[] fileInfos = dirInfo.GetFiles();
    foreach (FileInfo fileInfo in fileInfos)
    {
        subFileInfoList.Add(fileInfo);
    }

    DirectoryInfo[] subDirInfos = dirInfo.GetDirectories();
    foreach (DirectoryInfo subDirInfo in subDirInfos)
    {
        subDirInfoList.Add(subDirInfo);
        ListAllLevelSubDirAndFile(subDirInfo, ref subFileInfoList, ref subDirInfoList);
    }
}
### C# 中使用 `Directory` 类遍历文件夹C# 中,可以通过 `System.IO.Directory` 和 `System.IO.File` 类来操作文件和目录。以下是几种常见的方法来实现文件夹遍历功能。 #### 方法一:使用 `Directory.GetDirectories()` 和 `Directory.GetFiles()` 这种方法适用于简单的场景,能够逐层递归访问文件夹及其内部文件: ```csharp using System; using System.IO; class Program { static void Main() { string folderPath = @"C:\Your\FolderPath"; // 替换为目标文件夹路径 foreach (string directory in Directory.GetDirectories(folderPath, "*", SearchOption.AllDirectories)) { Console.WriteLine($"正在处理目录: {directory}"); foreach (string file in Directory.GetFiles(directory)) { Console.WriteLine($"\t找到文件: {file}"); // 输出每个文件路径 } } } } ``` 上述代码展示了如何通过 `SearchOption.AllDirectories` 参数递归地获取所有子目录中的文件[^1]。 --- #### 方法二:使用 `DirectoryInfo` 类 `DirectoryInfo` 是 .NET 提供的一个更灵活的对象模型,允许开发者以面向对象的方式管理目录结构。下面是一个示例: ```csharp using System; using System.IO; class Program { static void Main() { string path = @"C:\Your\FolderPath"; // 替换为目标文件夹路径 DirectoryInfo dir = new DirectoryInfo(path); if (!dir.Exists) { throw new DirectoryNotFoundException("指定的目录不存在!"); } TraverseDirectory(dir); } private static void TraverseDirectory(DirectoryInfo directory) { try { FileInfo[] files = directory.GetFiles(); foreach (FileInfo file in files) { Console.WriteLine(file.FullName); // 打印文件全路径 } DirectoryInfo[] subDirs = directory.GetDirectories(); foreach (DirectoryInfo subdir in subDirs) { TraverseDirectory(subdir); // 递归调用继续深入子目录 } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } ``` 此代码片段说明了如何利用 `DirectoryInfo` 对象逐一访问目标文件夹内的文件以及其所有的子文件夹[^2]。 --- #### 方法三:自定义递归函数 如果需要更高的灵活性或者特定逻辑控制,可以编写自己的递归算法。例如: ```csharp using System; using System.Collections.Generic; using System.IO; public class FileTraversalExample { public static Dictionary<string, List<string>> OverDirectories(string rootDir) { var result = new Dictionary<string, List<string>>(); if (Directory.Exists(rootDir)) { ProcessDirectory(rootDir, result); } return result; } private static void ProcessDirectory(string targetDir, Dictionary<string, List<string>> results) { try { // 获取当前目录下的所有文件 string[] files = Directory.GetFiles(targetDir); foreach (string fileName in files) { if (!results.ContainsKey(targetDir)) results[targetDir] = new List<string>(); results[targetDir].Add(fileName); } // 获取当前目录下的所有子目录并递归处理 string[] directories = Directory.GetDirectories(targetDir); foreach (string directoryName in directories) { ProcessDirectory(directoryName, results); } } catch (UnauthorizedAccessException e) { Console.WriteLine(e.Message); } } public static void Main() { string startLocation = @"C:\Your\Start\Folder"; var allFilesByDirectory = OverDirectories(startLocation); foreach (var kvp in allFilesByDirectory) { Console.WriteLine($"目录: {kvp.Key}"); foreach (var file in kvp.Value) { Console.WriteLine($"\t{file}"); } } } } ``` 该方法提供了一种更加模块化的方式来存储和展示数据,并支持按需扩展更多特性[^3]。 --- ### 总结 以上三种方式分别适合不同的需求层次: - 如果只是简单地列举文件,则可以直接采用 **方法一**; - 若希望获得更强的可读性和维护性,推荐使用 **方法二** 的 `DirectoryInfo` 方式; - 当项目复杂度较高或有特殊定制要求时,可以选择构建专属解决方案如 **方法三**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值