C#列表目录教程展示了如何在C#中列出目录内容。我们列出文件和目录,并根据文件名模式、文件扩展名、文件大小或内容过滤输出。
目录定义
目录,也称为文件夹,是您计算机上用于存储文件的位置。除了文件,目录还存储其他目录或快捷方式。
在C#中,我们可以使用Directory或DirectoryInfo来处理目录。Directory是一个静态类,它提供了处理目录的静态方法。DirectoryInfo的实例提供有关特定目录的信息。
这些类在System.IO命名空间中可用。
通常,这些方法返回一个可枚举集合(例如Directory.EnumerateFiles)或一个值数组(例如Directory.GetFiles)。当我们使用返回数组的方法时,我们必须等待整个数组返回,而使用enumerablecollection,我们可以立即处理数据。使用可枚举集合效率更高,占用的内存更少。
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());
该示例递归搜索文本文件,其文件名(路径的最后一部分)包含单词数据。
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);
}
}
该示例打印下载目录中大于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);
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#教程。
