zoukankan      html  css  js  c++  java
  • LINQ和文件目录

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

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

    string startFolder = @"C:UsersibiDesktop代码异步ConsoleApp4Test";
    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:UsersibiDesktop代码异步ConsoleApp4Test";
    
    // 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:UsersibiDesktop代码异步ConsoleApp4Test";
    
    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:UsersibiDesktop代码异步ConsoleApp4Test";
    string pathB = @"C:UsersibiDesktop代码异步ConsoleApp4TestTestX";
    
    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:UsersmycomputerDesktop代码异步ConsoleApp4TestTestX";
    
                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;
            }
        }   
    }
    View Code

    查询目录树中重复文件。

    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:UsersiubiuDesktop代码异步ConsoleApp4Test";
                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}";
            }
        }
    }
  • 相关阅读:
    C# Task ContinueWith的实现
    C# Task 是什么?返回值如何实现? Wait如何实现
    C# ExecutionContext 实现
    C# Barrier 实现
    C# CountdownEvent实现
    C# SemaphoreSlim 实现
    C# ManualResetEventSlim 实现
    C# Monitor实现
    C# SpinLock实现
    C# SpinWait 实现
  • 原文地址:https://www.cnblogs.com/bibi-feiniaoyuan/p/12405616.html
Copyright © 2011-2022 走看看