如何检查是否尝试用LINQ复制旧文件

本文关键字:LINQ 复制 文件 是否 何检查 检查 | 更新日期: 2023-09-27 18:09:36

我想得到答案,如果我可以替换旧文件或不-如果文件是旧的,我不想复制。问题是-每个目录中的文件数量可以不同。

我不想写很多方法,只是一个简单的LINQ查询,但我在LINQ上相当弱。

我想使用LINQ返回真或假。

System.IO.FileInfo[] filesSource = new System.IO.DirectoryInfo(sources).GetFiles();  
System.IO.FileInfo[] filesTarget = new System.IO.DirectoryInfo(target).GetFiles();  
bool canCopy = ... 
    /* group - if file have the same name
       if can't match and group - simply ignore it */ ...
(x => x.Source.LastWriteTime < x.Target.LastWriteTime).Count() == 0;

如何检查是否尝试用LINQ复制旧文件

这是我能想到的最好的

Linq Way:

System.IO.FileInfo[] filesSource = new System.IO.DirectoryInfo(source).GetFiles();
            System.IO.FileInfo[] filesTarget = new System.IO.DirectoryInfo(dest).GetFiles();
bool canCopy = !(from fileInfo in filesSource 
                 let tmp = filesTarget.FirstOrDefault(f => f.Name == fileInfo.Name) 
                 where tmp != null && tmp.LastWriteTime > fileInfo.LastWriteTime 
                 select fileInfo).Any();

正常方式:

private static bool CanCopyAllFiles(string source, string dest)
{
    System.IO.FileInfo[] filesSource = new System.IO.DirectoryInfo(source).GetFiles();
    System.IO.FileInfo[] filesTarget = new System.IO.DirectoryInfo(dest).GetFiles();
    foreach (FileInfo fileInfo in filesSource)
    {
        FileInfo tmp = filesTarget.FirstOrDefault(f => f.Name == fileInfo.Name);
        if (tmp != null && tmp.LastWriteTime > fileInfo.LastWriteTime)
        {
            return false;
        }
    }
    return true;
}

所以您需要做的第一件事是连接两个文件集合。您需要将每个源文件与其目标文件(如果有的话)进行匹配。这是通过GroupJoin完成的(与常规连接相反,因为我们希望返回没有匹配目标项的项)。

一旦我们完成了连接,那么我们可以过滤掉两个都有目标文件的项,并且目标文件是最近的。

public static IEnumerable<FileInfo> FilesToCopy(DirectoryInfo source, DirectoryInfo target)
{
    return from sourceFile in source.GetFiles()
            join targetFile in target.GetFiles()
            on sourceFile.FullName equals targetFile.FullName
            into destinationFiles
            let targetFile = destinationFiles.FirstOrDefault()
            where !destinationFiles.Any() ||
                sourceFile.LastWriteTime > targetFile.LastWriteTime
            select sourceFile;
}

如果你想在linq中做到这一点,你可以在名字上加入你的列表,然后比较源和目标之间的LastWriteTime…

        var filesToCopy = filesSource
            .GroupJoin(filesTarget, source => source.Name, target => target.Name,
                  (source, target) => new { Source = source, Target = target })
            .Where(x => !x.Target.Any() || x.Target.First().LastWriteTime < x.Source.LastWriteTime);
        foreach (var file in filesToCopy)
        {
            // copy file
        }

你的问题不是很清楚,但是这会复制源文件中较新的文件

foreach (var target in from target in filesTarget from source in filesSource where target.LastWriteTime < source.LastWriteTime select target)
{
    // Copy
}