C# 列出目录
最后修改于 2023 年 7 月 5 日
C# 列出目录教程展示了如何在 C# 中列出目录内容。 我们列出文件和目录,并根据文件名模式、文件扩展名、文件大小或内容过滤输出。
目录定义
目录,也称为文件夹,是用于在计算机上存储文件的位置。 除了文件之外,目录还存储其他目录或快捷方式。
在 C# 中,我们可以使用 Directory
或 DirectoryInfo
来处理目录。 Directory
是一个静态类,它提供了用于处理目录的静态方法。 DirectoryInfo
的实例提供了有关特定目录的信息。
这些类在 System.IO
命名空间中可用。
通常,这些方法返回可枚举的集合 (例如 Directory.EnumerateFiles
) 或值数组 (例如 Directory.GetFiles
)。 当我们使用返回数组的方法时,我们必须等待返回整个数组;而使用可枚举的集合时,我们可以立即处理数据。 使用可枚举的集合效率更高,占用更少的内存。
C# DirectoryInfo.EnumerateDirectories
DirectoryInfo.EnumerateDirectories
返回指定目录的目录信息的可枚举集合。
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
返回满足指定条件的完整文件名的可枚举集合。 在以下示例中,我们搜索具有多个扩展名的文件。
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
方法的替代解决方案。
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 文件名模式
在以下示例中,我们基于文件名模式列出文件。
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 文件大小
以下示例递归搜索大文件。
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 的文件。 文件的大小由 FileInfo
的 Length
属性确定。
C# Directory.EnumerateFiles 按文件大小排序
以下示例列出大文件并按降序对其进行排序。
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 文件日期时间
以下示例根据文件的创建日期时间列出所有文件。
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 搜索内容
在以下示例中,我们列出包含某些文本的文件。
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
返回子目录的名称。 子目录可能满足可选的指定条件。
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
方法,我们可以递归搜索目录。
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
返回满足(可选)条件的文件名。
string[] files = Directory.GetFiles("/home/janbodnar/Documents", "*.txt"); foreach (string name in files) { Console.WriteLine(name); }
该示例列出了 Documents
目录中的所有文件; 不会搜索子目录。
C# Directory.GetFiles 递归
使用 SearchOption.AllDirectories
选项,我们可以递归搜索文件。
string[] files = Directory.GetFiles("/home/janbodnar/Documents", "*.csv", SearchOption.AllDirectories); foreach (string name in files) { Console.WriteLine(name); }
该示例递归列出了用户 Documents
目录中的所有文件。
C# 目录大小
在以下示例中,我们确定目录的大小。
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");
要获取目录的大小,我们使用 DirectoryInfo
的 GetFiles
方法。 它返回一个 FileInfo
类型的数组。 FileInfo
的 Length
属性检索文件的大小。
foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories)) { size += fi.Length; }
我们搜索指定目录及其子目录中的所有文件。 我们获取每个检索到的文件的大小并将它们相加。
在本文中,我们展示了如何在 C# 中列出目录。
来源
作者
列出所有 C# 教程。