查询具有指定扩展名的文件 (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);}
查找目录中最大、最小的一个或多个文件。
using System;using System.Collections.Generic;using System.Data;using System.Diagnostics.CodeAnalysis;using System.IO;using System.Linq;using System.Reflection;namespace ConsoleApp4{ class Program { static void Main(string[] args) { string startFolder = @"C:\Users\mycomputer\Desktop\代码\异步\ConsoleApp4\Test\TestX\"; System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder); IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories); //查找文件最大字节数 long maxSize = fileList.Select(x => GetFileLength(x)).Max(); Console.WriteLine($"The length of the largest file under {startFolder} is {maxSize}"); //查找字节数最大的文件 var longestFile = fileList.OrderByDescending(x => GetFileLength(x)).First(); Console.WriteLine("The largest file under {0} is {1} with a length of {2} bytes", startFolder, longestFile.FullName, longestFile.Length); //查找字节数最小的文件 var smallestFile = fileList.OrderBy(x => GetFileLength(x)).First(); Console.WriteLine("The smallest file under {0} is {1} with a length of {2} bytes", startFolder, smallestFile.FullName, smallestFile.Length); //查找字节前十大的文件 var queryTenLargest = fileList.OrderByDescending(x => GetFileLength(x)).Take(10); Console.WriteLine("The 10 largest files under {0} are:", startFolder); foreach (var v in queryTenLargest) { Console.WriteLine("{0}: {1} bytes", v.FullName, v.Length); } } static long GetFileLength(System.IO.FileInfo fi) { long bytes; try { bytes = fi.Length; } catch (System.IO.FileNotFoundException) { //如果文件找不到 0字节处理 bytes = 0; } return bytes; } } }
查询目录树中重复文件。
using System;using System.Collections.Generic;using System.Data;using System.IO;using System.Linq;namespace ConsoleApp4{ class Program { static void Main(string[] args) { string startFolder = @"C:\Users\biubiu\Desktop\代码\异步\ConsoleApp4\Test\"; DirectoryInfo dir = new DirectoryInfo(startFolder); IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories); //根据文件名字、最后更新时间、字节长度来判断文件重复 var querySameGroup = from file in fileList group file.Name by new PortableKey { Name = file.Name, LastWriteTime = file.LastWriteTime, Length = file.Length } into fileGroup where fileGroup.Count() > 1 select fileGroup; //Linq 方法调用写法 //var querySameGroup2 = fileList.GroupBy(file => new PortableKey //{ // LastWriteTime = file.LastWriteTime, // Length = file.Length, // Name = file.Name //}, file => file.Name).Where(fileGroup => fileGroup.Count() > 1); foreach(var group in querySameGroup) { Console.WriteLine(group.Key); foreach(var item in group) { Console.WriteLine($" {item}"); } } } } class PortableKey { public string Name { get; set; } public DateTime LastWriteTime { get; set; } public long Length { get; set; } //分组跟这个相关 public override bool Equals(object obj) { PortableKey other = (PortableKey)obj; return this.LastWriteTime == other.LastWriteTime && this.Length == other.Length && this.Name == other.Name; } public override int GetHashCode() { string str = $"{this.LastWriteTime}{this.Length}{this.Name}"; return str.GetHashCode(); } public override string ToString() { return $"{this.Name} {this.Length} {this.LastWriteTime}"; } }}
联系客服