在C#中获取文件夹及子文件夹下所有文件的全面指南

目录

    • 引言
    • 1. 基础方法:使用Directory类
      • 1.1 Directory.GetFiles方法
      • 1.2 方法参数详解
    • 2. 高级方法:使用DirectoryInfo类
      • 2.1 DirectoryInfo的基本用法
      • 2.2 递归遍历实现
    • 3. 使用LINQ扩展方法
      • 3.1 结合LINQ进行文件筛选
      • 3.2 使用DirectoryInfo的LINQ扩展
    • 4. 并行处理技术
      • 4.1 使用Parallel.ForEach
      • 4.2 使用PLINQ
    • 5. 性能对比与分析
      • 5.1 不同方法的性能比较
      • 5.2 不同场景下的方法选择
    • 6. 异常处理与安全考虑
      • 6.1 常见异常类型
      • 6.2 健壮的实现方案
    • 7. 流程图:文件遍历处理流程
    • 8. 实际应用案例
      • 8.1 文件备份工具
      • 8.2 文件统计分析工具
    • 9. 性能优化技巧
      • 9.1 缓存目录结构
      • 9.2 延迟加载文件列表
    • 10. 跨平台考虑
      • 10.1 使用System.IO.Abstractions
      • 10.2 .NET Core/5+中的跨平台注意事项
    • 11. 结论

引言

在软件开发过程中,经常需要处理文件系统操作,其中获取文件夹及其子文件夹中的所有文件是一个常见需求。本文将深入探讨在C#中实现这一功能的多种方法,包括基本的Directory类用法、LINQ扩展、并行处理技术以及性能优化策略。我们还将分析不同方法的适用场景和性能特点,帮助您在实际项目中选择最合适的解决方案。

1. 基础方法:使用Directory类

1.1 Directory.GetFiles方法

System.IO命名空间中的Directory.GetFiles方法是最直接的获取文件方式。

using System;
using System.IO;

class Program
{
   
    static void Main()
    {
   
        string rootPath = @"C:\ExampleDirectory";
        
        try
        {
   
            // 获取所有文件(包括子目录)
            string[] allFiles = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
            
            Console.WriteLine($"找到 {
     allFiles.Length} 个文件:");
            foreach (string file in allFiles)
            {
   
                Console.WriteLine(file);
            }
        }
        catch (Exception ex)
        {
   
            Console.WriteLine($"发生错误: {
     ex.Message}");
        }
    }
}

1.2 方法参数详解

Directory.GetFiles有三个重载版本:

  • GetFiles(string path):获取指定目录中的文件
  • GetFiles(string path, string searchPattern):使用搜索模式获取文件
  • GetFiles(string path, string searchPattern, SearchOption searchOption):控制是否搜索子目录

SearchOption枚举有两个值:

  • TopDirectoryOnly:仅搜索指定目录
  • AllDirectories:搜索所有子目录

2. 高级方法:使用DirectoryInfo类

2.1 DirectoryInfo的基本用法

DirectoryInfo提供了更多面向对象的文件系统操作方法。

using System;
using System.IO;

class Program
{
   
    static void Main()
    {
   
        DirectoryInfo rootDir = new DirectoryInfo(@"C:\ExampleDirectory");
        
        // 获取所有文件
        FileInfo[] allFiles = rootDir.GetFiles("*.*", SearchOption.AllDirectories);
        
        Console.WriteLine($"找到 {
     allFiles.Length} 个文件:");
        foreach (FileInfo file in allFiles)
        {
   
            Console.WriteLine($"{
     file.FullName} - 大小: {
     file.Length} 字节 - 创建时间: {
     file.CreationTime}");
        }
    }
}

2.2 递归遍历实现

手动实现递归遍历可以提供更多控制:

static List<string> GetAllFiles(string directory)
{
   
    List<string> fileList = new List<string>();
    
    try
    {
   
        // 添加当前目录文件
        fileList.AddRange(Directory.GetFiles(directory));
        
        // 递归处理子目录
        foreach (string subDir in Directory.GetDirectories(directory))
        {
   
            fileList.AddRange(GetAllFiles(subDir));
        }
    }
    catch (UnauthorizedAccessException)
    {
   
        Console.WriteLine($"无法访问目录: {
     directory}");
    }
    
    return fileList;
}

3. 使用LINQ扩展方法

3.1 结合LINQ进行文件筛选

using System;
using System.IO;
using System.Linq;

class Program
{
   
    static void Main()
    {
   
        string rootPath = @"C:\ExampleDirectory";
        
        var allFiles = Directory.EnumerateFiles(rootPath, "*.*", SearchOption.AllDirectories)
                               .Where(f => Path.GetExtension(f).ToLower() == ".pdf")
                               .OrderBy(f => new FileInfo(f).Length)
                               .Select(f => new
                               {
   
                                   Path = f,
                  

你可能感兴趣的:(c#,c#,开发语言)