首页 > 解决方案 > 在 C# 中仅复制新的或修改的文件/目录

问题描述

我正在尝试在 C# 中创建一个简单的“目录/文件复制”控制台应用程序。我需要将所有文件夹和文件(保持原始层次结构)从一个驱动器复制到另一个驱动器,例如从驱动器 C:\Data 到驱动器 E :\数据。

但是,我只希望它将任何 NEW 或 MODIFIED 文件从源复制到目标。如果目标驱动器上的文件比源驱动器上的文件新,则不会复制。

(问题)

在我拥有的代码中,它将源中的文件“abc.pdf”与目标中的文件“xyz.pdf”进行比较,因此即使目标文件较新,也会用源中的任何内容覆盖目标文件。我试图弄清楚如何将源中的“abc.pdf”与目标中的“abc.pdf”进行比较。

如果我将源和目标向下钻取到特定文件,则此方法有效,但是当我返回到文件夹级别时,即使目标文件较新,它也会用源文件覆盖目标文件。

(我的解决方案——没用)

我认为通过将“if (file.LastWriteTime > destination.LastWriteTime)”放在“foreach”命令之后,它会比较两个文件夹中的文件,File1 源文件与 File1 目标文件,但事实并非如此。

似乎我在“FileInfo[]”、“foreach”或“if”语句中遗漏了一些东西,以便进行一对一的比较。我想可能是对“Path.Combine”语句或“SearchOption.AllDirectories”的一些引用,但我不确定。

有什么建议么?

正如您从我的基本代码示例中看到的那样,我是 C# 新手,所以请用简单的语言回答您的问题。

谢谢你。

这是我尝试过的代码,但它不起作用。


class Copy  
{  
    public static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination)  
    {  
        if (!destination.Exists)  
        {  
            destination.Create();  
        }  
        // Copy files.  
        FileInfo[] files = source.GetFiles();  
        FileInfo[] destFiles = destination.GetFiles();  
        foreach (FileInfo file in files)  
            foreach (FileInfo fileD in destFiles)  
                // Copy only modified files    
                    if (file.LastWriteTime > fileD.LastWriteTime)  
                    {  
                        file.CopyTo(Path.Combine(destination.FullName,  
                        file.Name), true);  
                    }  

                // Copy all new files  
                else  
                if (!fileD.Exists)  
                {  
                    file.CopyTo(Path.Combine(destination.FullName, file.Name), true);  
                }  
        // Process subdirectories.  
        DirectoryInfo[] dirs = source.GetDirectories();  
        foreach (DirectoryInfo dir in dirs)  
        {  
            // Get destination directory.  
            string destinationDir = Path.Combine(destination.FullName, dir.Name);  
            // Call CopyDirectory() recursively.  
            CopyDirectory(dir, new DirectoryInfo(destinationDir));  
        }  
    }  
}  

标签: c#copyfilesystems

解决方案


您可以只获取“源”中的文件数组并检查“目标”中的匹配名称

/// <summary>
    /// checks whether the target file needs an update (if it doesn't exist: it needs one)
    /// </summary>
    public static bool NeedsUpdate(FileInfo localFile, DirectoryInfo localDir, DirectoryInfo backUpDir)
    {
        bool needsUpdate = false;

        if (!File.Exists(Path.Combine(backUpDir.FullName, localFile.Name)))
        {
            needsUpdate = true;
        }
        else
        {
            FileInfo backUpFile = new FileInfo(Path.Combine(backUpDir.FullName, localFile.Name));

            DateTime lastBackUp = backUpFile.LastWriteTimeUtc;
            DateTime lastChange = localFile.LastWriteTimeUtc;

            if (lastChange != lastBackUp)
            {
                needsUpdate = true;
            }
            else
            {/*no change*/}
        }
        return needsUpdate;
    }

推荐阅读