Code Bye

怎么筛选出相同文件名并删除

 

新手求论坛牛人指导下,在不通过sql的情况下怎么实现:一个文件下下面包含多个子文件夹的文件,怎么筛选出相同文件名并删除,只保留最后创建时间最晚的一个文件?

首先遍历文件夹,把你需要的文件都找出来放到列表中,当然你要知道哪个是不删除的,然后遍历列表,根据路径删除
static void FileCompare(string directory1,string direcotry2)
        {
            var arr1 = Directory.GetFiles(directory1).Select(x => Path.GetFileName(x));
            var arr2 = Directory.GetFiles(direcotry2).Select(x => Path.GetFileName(x));
            foreach (var str in arr1.Intersect(arr2))
            {
                DateTime dt1 = File.GetLastWriteTime(Path.Combine(directory1, str));
                DateTime dt2 = File.GetLastWriteTime(Path.Combine(direcotry2, str));
                //比较两个的时间
            }
        }
引用 1 楼 bdmh 的回复:

首先遍历文件夹,把你需要的文件都找出来放到列表中,当然你要知道哪个是不删除的,然后遍历列表,根据路径删除

这是我自己写的遍历文件夹,然后下面不知道该怎么动手了。。给几段关键性代码学习下吗?

        public void FindFile(string sSourcePath)
        {
           
            DirectoryInfo Dir = new DirectoryInfo(sSourcePath);
            DirectoryInfo[] DirSub = Dir.GetDirectories();
          
          //  string Strerr=".err";
            if (DirSub.Length <= 0)
            {
                foreach (FileInfo f in Dir.GetFiles("*.*", SearchOption.TopDirectoryOnly)) 
                {
                    
                  //if (f.ToString().Contains(Strerr))
                    //{
                    //    f.Delete();
                    //}
            
                  }
            }
引用 2 楼 starfd 的回复:
static void FileCompare(string directory1,string direcotry2)
        {
            var arr1 = Directory.GetFiles(directory1).Select(x => Path.GetFileName(x));
            var arr2 = Directory.GetFiles(direcotry2).Select(x => Path.GetFileName(x));
            foreach (var str in arr1.Intersect(arr2))
            {
                DateTime dt1 = File.GetLastWriteTime(Path.Combine(directory1, str));
                DateTime dt2 = File.GetLastWriteTime(Path.Combine(direcotry2, str));
                //比较两个的时间
            }
        }

怎么筛选出相同文件名,并删除掉呢?

你可以把文件名和文件修改时间放到字典里
遍历的时候,把信息放入字典
放入之前,先判断是否有key,没有就放入
如果有,再判断时间,新的放入字典,旧的删除文件
引用 5 楼 Z65443344 的回复:

你可以把文件名和文件修改时间放到字典里
遍历的时候,把信息放入字典
放入之前,先判断是否有key,没有就放入
如果有,再判断时间,新的放入字典,旧的删除文件

刚接触编程,目前还没有这能力。你说的字典是什么意思? 数组吗?

100分
arr1.Intersect(arr2)并集啊……
当然这是两个文件夹进行比较的情况,如果你的文件夹数量不定的时候,更好的办法还是版主说的,先递归遍历文件夹,获取所有的文件路径,然后用Linq获取下
List<string> paths;//怎么递归获取这里就不写了
var query = from p in paths
                 group p by Path.GetFileName(p).ToLower() into g
                 where g.Count()>1
                select g;
foreach(var g in query)
{
        foreach(var filePath in g.OrderByDescending(x=>File.GetCreationTime(x)).Skip(1))//最后创建的不删除
        {
                   File.Delete(filePath);
        }
}
static void GetFiles(string directory, List<string> paths)
        {
            paths.AddRange(Directory.GetFiles(directory));
            var directories = Directory.GetDirectories(directory);
            if(directories!=null && directories.Length>0)
            {
                foreach (var dir in directories)
                {
                    GetFiles(dir, paths);
                }
            }
        }

好人做到底,递归方法也写了
调用方法就是

List<string> paths = new List<string>();
GetFiles("你要获取的物理目录", paths);
引用 8 楼 starfd 的回复:
static void GetFiles(string directory, List<string> paths)
        {
            paths.AddRange(Directory.GetFiles(directory));
            var directories = Directory.GetDirectories(directory);
            if(directories!=null && directories.Length>0)
            {
                foreach (var dir in directories)
                {
                    GetFiles(dir, paths);
                }
            }
        }

好人做到底,递归方法也写了
调用方法就是

List<string> paths = new List<string>();
GetFiles("你要获取的物理目录", paths);

stardf,感谢你。

用到了字典用到了Dictionary<string, DateTime>  files = new  Dictionary<string, DateTime>;

static void GetFiles(string directory, List<string> paths)
        {
            paths.AddRange(Directory.GetFiles(directory));

            var directories = Directory.GetDirectories(directory);
            DirectoryInfo dir = new DirectoryInfo(AllPath);
            FileSystemInfo[] files = dir.GetFileSystemInfos();
            foreach (FileSystemInfo FSInfo in files)
            {
                FileInfo file = FSInfo as FileInfo;
                if (file != null)
                {
                     if   (files.ContainsKey(file.Name))
                     {
                        if (files[file.Name] < file.CreationTime)
                           {
                                 files[file.Name] =file.CreationTime;
                            }
                       }
                      else
                      {
                       files.add(file.Name,file.CreationTime)
                        }
                }
            }
            if(directories!=null && directories.Length>0)
            {
                foreach (var dir in directories)
                {
                    GetFiles(dir, paths);
                }
            }
        }


调用方法:

List<string> paths = new List<string>();
Dictionary<string, DateTime>  files = new  Dictionary<string, DateTime>;
GetFiles("你要获取的物理目录", paths);


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么筛选出相同文件名并删除