LINQ和文件目录

♀尐吖头ヾ 提交于 2020-03-04 00:09:47

记录https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/linq/linq-and-file-directories的学习

 

查询具有指定扩展名的文件 (SearchOption.AllDirectories 指递归文件夹获取所有文件)

string startFolder = @"C:\Users\bibi\Desktop\代码\异步\ConsoleApp4\Test\";
DirectoryInfo dir = new DirectoryInfo(startFolder);
IEnumerable<FileInfo> fileList = dir.GetFiles("*.*", SearchOption.AllDirectories);

var fileQuery = from file in fileList
                where file.Extension == ".png"
                orderby file.Name
                select file;

foreach(var item in fileQuery)
{
    Console.WriteLine(item.FullName);
}

按扩展名对文件进行分组

// Take a snapshot of the file system.  
string startFolder = @"C:\Users\bibi\Desktop\代码\异步\ConsoleApp4\Test\";

// Used in WriteLine to trim output lines.  
int trimLength = startFolder.Length;

// Take a snapshot of the file system.  
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);

// This method assumes that the application has discovery permissions  
// for all folders under the specified path.  
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

var queryGroupByExt = from file in fileList
                      group file by file.Extension.ToLower() into fileGroup
                      orderby fileGroup.Key
                      select fileGroup;

foreach(var group in queryGroupByExt)
{
    Console.WriteLine(group.Key);
    foreach(var item in group)
    {
        Console.WriteLine($"    {item.Name}");
    }
}

求目录下的所有文件的总字节数

string startFolder = @"C:\Users\bibi\Desktop\代码\异步\ConsoleApp4\Test\";

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder);
var totalLength = dir.GetFiles().Sum(x=>x.Length);

Console.WriteLine(totalLength+" bytes");

对接文件夹中的文件(序列求等SequenceEqual、交集Insect、差集Except)

string pathA = @"C:\Users\bibi\Desktop\代码\异步\ConsoleApp4\Test\";
string pathB = @"C:\Users\bibi\Desktop\代码\异步\ConsoleApp4\Test\TestX\";

System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(pathA);
System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(pathB);
//使用了顶层目录SearchOption.TopDirectoryOnly,不需递归目录下的文件夹寻找文件,只要第一层文件。
IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.*", SearchOption.TopDirectoryOnly);
IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.*", SearchOption.TopDirectoryOnly);

//使用自定义的文件默认比较器
FileCompare myFileCompare = new FileCompare();

//判断两个序列是否相等
bool isEqualOne = list1.SequenceEqual(list2, myFileCompare);
if (isEqualOne == true)
{
    Console.WriteLine("the two folders are the same");
}
else
{
    Console.WriteLine("The two folders are not the same");
}

//求交集文件
var queryCommonFiles = list1.Intersect(list2, myFileCompare);
if (queryCommonFiles.Any())
{
    Console.WriteLine("The following files are in both folders:");
    foreach (var v in queryCommonFiles)
    {
        Console.WriteLine(v.FullName); //shows which items end up in result list  
    }
}

//求差集文件 在list1却不在list2的文件
var queryList1Only = list1.Except(list2, myFileCompare);
Console.WriteLine("The following files are in list1 but not list2:");
foreach (var v in queryList1Only)
{
    Console.WriteLine(v.FullName);
}         

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!