在C#中处理批量图片时,最常遇到的需求就是把一个文件夹以及它下面所有层级的子目录中的图片都找出来。利用.NET自带的IO类可以非常简洁地实现这个逻辑,不需要自己写复杂的递归方法。

使用Directory类直接搜索
最简单的方式是调用Directory.GetFiles方法,并把搜索选项设为SearchOption.AllDirectories。这样方法会遍历所有子目录。我们可以通过扩展名数组来过滤出常见的图片格式。
using System;
using System.IO;
class Program
{
static void Main()
{
// 根目录路径,可换成你自己的文件夹
string rootPath = @"C:Images";
// 常见图片扩展名
string[] extensions = { ".jpg", ".jpeg", ".png", ".bmp", ".gif" };
try
{
// 搜索所有子目录中的文件
string[] allFiles = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
foreach (string file in allFiles)
{
string ext = Path.GetExtension(file).ToLower();
if (Array.Exists(extensions, e => e == ext))
{
Console.WriteLine("图片文件: " + file);
}
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("无权访问部分目录: " + ex.Message);
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine("目录不存在: " + ex.Message);
}
}
}
使用DirectoryInfo递归遍历
如果希望在遍历过程中做更多控制,比如跳过某些子目录,可以使用DirectoryInfo配合递归函数。下面示例展示了手动递归的方式。
using System;
using System.IO;
class Program
{
static void Main()
{
DirectoryInfo root = new DirectoryInfo(@"C:Images");
WalkDirectory(root);
}
static void WalkDirectory(DirectoryInfo dir)
{
try
{
foreach (FileInfo file in dir.GetFiles())
{
string ext = file.Extension.ToLower();
if (ext == ".jpg" || ext == ".png" || ext == ".bmp" || ext == ".gif")
{
Console.WriteLine("找到图片: " + file.FullName);
}
}
foreach (DirectoryInfo subDir in dir.GetDirectories())
{
WalkDirectory(subDir);
}
}
catch (UnauthorizedAccessException)
{
// 跳过无权限目录
}
}
}
注意事项
- 遍历系统目录或外部磁盘时,可能遇到无权限访问的文件夹,务必用try-catch包裹。
- 如果目录层级非常深或文件极多,递归可能导致栈溢出,此时用
Directory.GetFiles带AllDirectories参数更稳妥。 - 路径建议使用@前缀或双反斜杠,避免转义错误。
通过上述两种方法,你就能在C#中轻松实现遍历文件夹及子目录下所有图片的功能,根据实际场景选择即可。