新手求论坛牛人指导下,在不通过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)); //比较两个的时间 } } |
|
这是我自己写的遍历文件夹,然后下面不知道该怎么动手了。。给几段关键性代码学习下吗? 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(); //} } } |
|
怎么筛选出相同文件名,并删除掉呢? |
|
你可以把文件名和文件修改时间放到字典里
遍历的时候,把信息放入字典 放入之前,先判断是否有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); |
|
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); |