ZetCode

C# 列出目录

最后修改于 2023 年 7 月 5 日

C# 列出目录教程展示了如何在 C# 中列出目录内容。 我们列出文件和目录,并根据文件名模式、文件扩展名、文件大小或内容过滤输出。

目录定义

目录,也称为文件夹,是用于在计算机上存储文件的位置。 除了文件之外,目录还存储其他目录或快捷方式。

在 C# 中,我们可以使用 DirectoryDirectoryInfo 来处理目录。 Directory 是一个静态类,它提供了用于处理目录的静态方法。 DirectoryInfo 的实例提供了有关特定目录的信息。

这些类在 System.IO 命名空间中可用。

通常,这些方法返回可枚举的集合 (例如 Directory.EnumerateFiles) 或值数组 (例如 Directory.GetFiles)。 当我们使用返回数组的方法时,我们必须等待返回整个数组;而使用可枚举的集合时,我们可以立即处理数据。 使用可枚举的集合效率更高,占用更少的内存。

C# DirectoryInfo.EnumerateDirectories

DirectoryInfo.EnumerateDirectories 返回指定目录的目录信息的可枚举集合。

Program.cs
var myDir = "/home/janbodnar/Downloads/";
var dirInfo = new DirectoryInfo(myDir);

var dirs = dirInfo.EnumerateDirectories("*", new EnumerationOptions 
    { RecurseSubdirectories = true });

foreach (var name in dirs)
{
    Console.WriteLine(name);
}

在此示例中,我们递归地查找所选目录中的所有目录。

C# Directory.EnumerateFiles 多个扩展名

Directory.EnumerateFiles 返回满足指定条件的完整文件名的可枚举集合。 在以下示例中,我们搜索具有多个扩展名的文件。

Program.cs
var path = "/home/janbodnar/Documents";

var result = Directory.EnumerateFiles(path, "*.txt", 
    SearchOption.AllDirectories).Union(Directory.EnumerateFiles(path, "*.csv", 
    SearchOption.AllDirectories));

foreach (var file in result)
{
    Console.WriteLine(file);
}

该示例列出了所有文本和 CSV 文件。 我们使用 LINQ 和 Union 操作。

以下示例是使用 LINQ 的 Where 方法的替代解决方案。

Program.cs
string path = "/home/janbodnar/";
string[] extensions = { ".csv", ".txt", ".pdf" };

var files = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories)
    .Where(s => extensions.Any(ext => ext == Path.GetExtension(s)));

foreach (string file in files)
{
    Console.WriteLine(file);
}

Console.WriteLine("{0} files found.", files.Count<string>().ToString());

该示例递归搜索 CSV、TXT 和 PDF 文件。

C# Directory.EnumerateFiles 文件名模式

在以下示例中,我们基于文件名模式列出文件。

Program.cs
var path = "/home/janbodnar/";

var files = from file in Directory.EnumerateFiles(path, "*.txt", 
                SearchOption.AllDirectories)
            where Path.GetFileName(file).ToLower().Contains("data")
            select file;

foreach (var file in files)
{
    Console.WriteLine("{0}", file);
}

Console.WriteLine("{0} files found.", files.Count<string>().ToString());

该示例递归搜索文本文件,其文件名(路径的最后一部分)包含单词 data。

C# Directory.EnumerateFiles 文件大小

以下示例递归搜索大文件。

Program.cs
long limit = 1024 * 1024 * 1024;
var path = "/home/janbodnar/Downloads/";

var dirInfo = new DirectoryInfo(path);

foreach (var fInfo in dirInfo.EnumerateFiles("*", 
    SearchOption.AllDirectories))
{
    if (fInfo.Length > limit) 
    {
        Console.WriteLine(fInfo.Name);
    }
}

该示例打印 Downloads 目录中所有大于 1GB 的文件。 文件的大小由 FileInfoLength 属性确定。

C# Directory.EnumerateFiles 按文件大小排序

以下示例列出大文件并按降序对其进行排序。

Program.cs
var path = "/home/janbodnar/Downloads/";
var size = 1024 * 1024 * 1024;
var directory = new DirectoryInfo(path);

var files = from fInfo in directory.EnumerateFiles("*",
                SearchOption.AllDirectories)
            where fInfo.Length > size
            orderby fInfo.Length descending
            select new
            {
                FullName = fInfo.FullName,
                Size = fInfo.Length
            };

foreach (var file in files)
{
    Console.WriteLine($"{file.FullName} - {file.Size} bytes");
}
 

该示例递归搜索大文件 (> 1GB) 并按降序对其进行排序。

C# Directory.EnumerateFiles 文件日期时间

以下示例根据文件的创建日期时间列出所有文件。

Program.cs
var path = "/home/janbodnar/Documents";

var directory = new DirectoryInfo(path);
var dateLimit = new DateTime(2010, 01, 01);

var files = from file in directory.EnumerateFiles("*",
                SearchOption.AllDirectories)
            where file.CreationTimeUtc < dateLimit
            select new
            {
                FullName = file.FullName,
            };

foreach (var file in files)
{
    Console.WriteLine($"{file.FullName}");
}

在此示例中,我们列出 2010 年之前创建的所有文件。

C# Directory.EnumerateFiles 搜索内容

在以下示例中,我们列出包含某些文本的文件。

Program.cs
var files = from file in Directory.EnumerateFiles("balzac", "*.txt", 
                    SearchOption.AllDirectories)
            from line in File.ReadLines(file)
            where line.Contains("Rastignac")
            select new
            {
                File = file,
                Line = line
            };

foreach (var file in files) 
{
    Console.WriteLine(file);
}

在此示例中,我们递归搜索 balzac 目录中的文本文件,并查找 Rastignac 角色。 我们打印出每本提到他的书中的一行。

$ dotnet run
{ File = balzac/father_goriot.txt, Line = Misfortune had accustomed Eugene de Rastignac, for that was his name, to }
{ File = balzac/father_goriot.txt, Line = Eugene de Rastignac was a thoroughly southern type; he had a fair }
{ File = balzac/father_goriot.txt, Line = beginning of Eugene de Rastignac's second twelvemonth, this figure }
{ File = balzac/father_goriot.txt, Line = Eugene de Rastignac had just returned to Paris in a state of mind not }
{ File = balzac/father_goriot.txt, Line = Rastignac's first year of study for the preliminary examinations in law }
...

C# Directory.GetDirectories

Directory.GetDirectories 返回子目录的名称。 子目录可能满足可选的指定条件。

Program.cs
var path = "/home/janbodnar/Documents";

string[] myDirs = Directory.GetDirectories(path);
Console.WriteLine("Directories:");

foreach (var myDir in myDirs)
{
    Console.WriteLine(myDir);
}

该示例列出了指定目录的顶级子目录。

string[] myDirs = Directory.GetDirectories(path);
注意: Directory.GetDirectories 方法返回一个字符串数组。 对于复杂的任务,这会占用大量内存。

C# Directory.GetDirectories 递归

SearchOption.AllDirectories 选项传递给 Directory.GetDirectories 方法,我们可以递归搜索目录。

Program.cs
var docPath = "/home/janbodnar/Documents";

string[] myDirs = Directory.GetDirectories(docPath, "t*",
        SearchOption.AllDirectories);

Console.WriteLine("Directories:");

foreach (var myDir in myDirs)
{
    Console.WriteLine(myDir);
}

该示例列出了所有以 t 字符开头的目录。

string[] myDirs = Directory.GetDirectories(docPath, "t*",
    SearchOption.AllDirectories);

Directory.GetDirectories 的第一个参数是要列出的目录。 第二个参数是要与要列出的子目录名称匹配的搜索字符串。 第三个参数指定搜索操作应包括所有子目录还是仅包括当前目录。

C# Directory.GetFiles

Directory.GetFiles 返回满足(可选)条件的文件名。

Program.cs
string[] files = Directory.GetFiles("/home/janbodnar/Documents", "*.txt");

foreach (string name in files)
{
    Console.WriteLine(name);
}

该示例列出了 Documents 目录中的所有文件; 不会搜索子目录。

C# Directory.GetFiles 递归

使用 SearchOption.AllDirectories 选项,我们可以递归搜索文件。

Program.cs
string[] files = Directory.GetFiles("/home/janbodnar/Documents", "*.csv", 
    SearchOption.AllDirectories);

foreach (string name in files)
{
    Console.WriteLine(name);
}

该示例递归列出了用户 Documents 目录中的所有文件。

C# 目录大小

在以下示例中,我们确定目录的大小。

Program.cs
long size = 0;
var path = "/home/janbodnar/Documents/prog/c#/";

var dirInfo = new DirectoryInfo(path);

foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories))
{
    size += fi.Length;
}

Console.WriteLine($"The directory size: {size} bytes");

要获取目录的大小,我们使用 DirectoryInfoGetFiles 方法。 它返回一个 FileInfo 类型的数组。 FileInfoLength 属性检索文件的大小。

foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories))
{
    size += fi.Length;
}

我们搜索指定目录及其子目录中的所有文件。 我们获取每个检索到的文件的大小并将它们相加。

在本文中,我们展示了如何在 C# 中列出目录。

来源

Directory 类 - 语言参考

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程