|
新手求论坛牛人指导下,在不通过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);
|
|