如何使用C#编写搜索目录并列出文件的程序

来源:Vuejs社区作者:IT小魔仙头衔:程序员
导读:本期聚焦于小伙伴创作的《如何使用C#编写搜索目录并列出文件的程序》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用C#编写搜索目录并列出文件的程序》有用,将其分享出去将是对创作者最好的鼓励。

在C#开发中,搜索目录并列出文件是常见的文件操作需求,无论是做本地文件管理工具,还是处理批量文件任务,都需要用到相关的实现逻辑,核心依赖System.IO命名空间提供的文件操作类。

如何使用C#编写搜索目录并列出文件的程序

基础实现:列出单级目录下的所有文件

如果只是需要列出目标目录下直接包含的文件,不需要遍历子目录,可以使用DirectoryInfo类配合GetFiles方法快速实现,这种方式代码简洁,适合简单的文件列示场景。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        // 指定要搜索的目录路径,这里可以替换为实际需要的路径
        string targetDir = @"D:test";
        DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
        
        // 判断目录是否存在
        if (!dirInfo.Exists)
        {
            Console.WriteLine("指定的目录不存在");
            return;
        }
        
        // 获取当前目录下的所有文件,不包含子目录
        FileInfo[] files = dirInfo.GetFiles();
        
        Console.WriteLine($"目录 {targetDir} 下的文件列表:");
        foreach (FileInfo file in files)
        {
            // 输出文件名、大小和最后修改时间
            Console.WriteLine($"文件名:{file.Name},大小:{file.Length}字节,最后修改时间:{file.LastWriteTime}");
        }
    }
}

进阶实现:递归搜索所有子目录的文件

实际场景中往往需要搜索目标目录下的所有子目录,列出全部层级的文件,这时候可以通过递归调用或者GetFiles方法的搜索选项参数来实现,两种方式各有适用场景。

方式一:使用GetFiles方法的搜索参数

GetFiles方法支持传入SearchOption枚举参数,设置为SearchOption.AllDirectories就可以直接获取所有子目录的文件,代码更简洁。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string targetDir = @"D:test";
        DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
        
        if (!dirInfo.Exists)
        {
            Console.WriteLine("指定的目录不存在");
            return;
        }
        
        // 使用AllDirectories参数递归搜索所有子目录的文件
        FileInfo[] allFiles = dirInfo.GetFiles("*", SearchOption.AllDirectories);
        
        Console.WriteLine($"目录 {targetDir} 及其所有子目录下的文件总数:{allFiles.Length}");
        foreach (FileInfo file in allFiles)
        {
            Console.WriteLine($"完整路径:{file.FullName}");
        }
    }
}

方式二:自定义递归方法实现

如果需要更灵活的控制,比如过滤特定类型的文件、跳过某些子目录,可以自定义递归方法,在遍历过程中添加自定义逻辑。

using System;
using System.IO;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string targetDir = @"D:test";
        List<FileInfo> allFiles = new List<FileInfo>();
        // 调用自定义递归方法收集所有文件
        CollectAllFiles(targetDir, allFiles);
        
        Console.WriteLine($"总共找到 {allFiles.Count} 个文件");
        foreach (FileInfo file in allFiles)
        {
            Console.WriteLine(file.FullName);
        }
    }
    
    static void CollectAllFiles(string currentDir, List<FileInfo> fileList)
    {
        DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
        if (!dirInfo.Exists)
        {
            return;
        }
        
        // 收集当前目录的文件
        fileList.AddRange(dirInfo.GetFiles());
        
        // 递归处理所有子目录
        foreach (DirectoryInfo subDir in dirInfo.GetDirectories())
        {
            // 这里可以添加条件跳过不需要搜索的子目录,比如跳过隐藏目录
            if ((subDir.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
            {
                CollectAllFiles(subDir.FullName, fileList);
            }
        }
    }
}

实用功能扩展

在实际使用中,我们往往需要对搜索到的文件做进一步过滤或者处理,以下是几个常见的扩展场景实现。

按文件扩展名过滤

如果只需要列出特定类型的文件,比如只找txt文件,可以在获取文件后添加过滤条件,或者直接在GetFiles方法中指定搜索模式。

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

class Program
{
    static void Main()
    {
        string targetDir = @"D:test";
        DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
        
        // 方式1:使用GetFiles的搜索模式参数,直接搜索txt文件
        FileInfo[] txtFiles = dirInfo.GetFiles("*.txt", SearchOption.AllDirectories);
        
        // 方式2:先获取所有文件再按扩展名过滤,适合多条件过滤场景
        FileInfo[] allFiles = dirInfo.GetFiles("*", SearchOption.AllDirectories);
        FileInfo[] pdfFiles = allFiles.Where(f => f.Extension.Equals(".pdf", StringComparison.OrdinalIgnoreCase)).ToArray();
        
        Console.WriteLine($"找到的txt文件数量:{txtFiles.Length}");
        Console.WriteLine($"找到的pdf文件数量:{pdfFiles.Length}");
    }
}

处理访问权限异常

在搜索系统目录或者受权限保护的目录时,可能会抛出UnauthorizedAccessException异常,需要在代码中添加异常处理逻辑,避免程序崩溃。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string targetDir = @"D:test";
        try
        {
            DirectoryInfo dirInfo = new DirectoryInfo(targetDir);
            FileInfo[] allFiles = dirInfo.GetFiles("*", SearchOption.AllDirectories);
            Console.WriteLine($"找到 {allFiles.Length} 个文件");
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine($"访问目录权限不足:{ex.Message}");
        }
        catch (DirectoryNotFoundException ex)
        {
            Console.WriteLine($"目录不存在:{ex.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生异常:{ex.Message}");
        }
    }
}

注意事项

  • 路径字符串建议使用@前缀的逐字字符串,避免反斜杠需要转义的问题,比如@"C:test"而不是"C:\test"
  • 操作文件前一定要先判断目录或者文件是否存在,避免抛出不必要的异常
  • 如果处理的目录层级很深或者文件数量很多,递归搜索可能会占用较多内存,可以考虑使用迭代方式替代递归
  • 涉及文件操作时尽量添加异常处理,特别是访问用户指定目录的场景,权限问题很常见

C#目录搜索文件列出DirectoryInfoFileInfo修改时间:2026-06-24 05:48:35

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。