C# 复制文件,如果更新则覆盖

C# 复制文件,如果更新则覆盖,c#,.net,C#,.net,在C#.NET中,如何将文件复制到另一个位置,如果源文件比现有文件新(具有更晚的“修改日期”),则覆盖现有文件,如果源文件较旧,则进行注释?您可以使用FileInfo类: FileInfo infoOld = new FileInfo("C:\\old.txt"); FileInfo infoNew = new FileInfo("C:\\new.txt"); if (infoNew.LastWriteTime > infoOld.LastWriteTime) { File.Co

在C#.NET中,如何将文件复制到另一个位置,如果源文件比现有文件新(具有更晚的“修改日期”),则覆盖现有文件,如果源文件较旧,则进行注释?

您可以使用FileInfo类:

FileInfo infoOld = new FileInfo("C:\\old.txt");
FileInfo infoNew = new FileInfo("C:\\new.txt");

if (infoNew.LastWriteTime > infoOld.LastWriteTime)
{
    File.Copy(source path,destination path, true) ;
}
您可以使用及其属性和方法:

FileInfo file = new FileInfo(path);
string destDir = @"C:\SomeDirectory";
FileInfo destFile = new FileInfo(Path.Combine(destDir, file.Name));
if (destFile.Exists)
{
    if (file.LastWriteTime > destFile.LastWriteTime)
    { 
        // now you can safely overwrite it
        file.CopyTo(destFile.FullName, true);
    }
}

在批处理文件中,这将起作用:

XCopy "c:\my directory\source.ext" "c:\my other directory\dest.ext" /d

以下是我对答案的看法:复制而不是移动文件夹内容。如果目标不存在,代码更清晰易读。从技术上讲,为不存在的文件创建fileinfo的LastWriteTime为DateTime.Min,因此会复制,但在可读性方面有点不足。我希望这段经过测试的代码对某些人有所帮助

**编辑:我已经更新了我的源代码,使其更加灵活。因为它是基于这个线程,所以我在这里发布了更新。使用遮罩时,如果子文件夹不包含匹配的文件,则不会创建子文件夹。当然,将来会有一个更健壮的错误处理程序。:)


这是windows还是web方法?使用批处理文件,您可能会发现这更容易,我认为xcopy命令使这更简单。我知道您的问题已经得到了回答。我倾向于将我的测试源添加到回答我初始问题的线程中。享受。是的。。但可能更复杂,因为我们必须处理路径中的空格等。公平地说,我认为批处理文件允许您在文件路径周围加上单引号或双引号,如果这样做有帮助的话,请注意这不是递归调用。(这需要维基化)这真的很有效。我建议再做一点改进。如果源文件和目标文件中都存在该文件,则添加校验和测试,以便在它们相同时不复制该文件。公共字符串GetChecksum(字符串文件路径){using(var stream=new BufferedStream(File.OpenRead(filePath),1200000)){SHA256Managed sha=new SHA256Managed();byte[]checksum=sha.ComputeHash(stream);返回BitConverter.ToString(checksum)。替换(“-”,String.Empty);}@christorhaws,这是个好主意。我一分钟后会把它折叠起来。:)如果使用
Path.combined
而不是
+
,则不必在sourceFolder.EndsWithjiggery porky中执行所有
操作。
public void CopyFolderContents(string sourceFolder, string destinationFolder)
{
    CopyFolderContents(sourceFolder, destinationFolder, "*.*", false, false);
}

public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask)
{
    CopyFolderContents(sourceFolder, destinationFolder, mask, false, false);
}

public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask, Boolean createFolders, Boolean recurseFolders)
{
    try
    {
        if (!sourceFolder.EndsWith(@"\")){ sourceFolder += @"\"; }
        if (!destinationFolder.EndsWith(@"\")){ destinationFolder += @"\"; }

        var exDir = sourceFolder;
        var dir = new DirectoryInfo(exDir);
        SearchOption so = (recurseFolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);

        foreach (string sourceFile in Directory.GetFiles(dir.ToString(), mask, so))
        {
            FileInfo srcFile = new FileInfo(sourceFile);
            string srcFileName = srcFile.Name;

            // Create a destination that matches the source structure
            FileInfo destFile = new FileInfo(destinationFolder + srcFile.FullName.Replace(sourceFolder, ""));

            if (!Directory.Exists(destFile.DirectoryName ) && createFolders)
            {
                Directory.CreateDirectory(destFile.DirectoryName);
            }

            if (srcFile.LastWriteTime > destFile.LastWriteTime || !destFile.Exists)
            {
                File.Copy(srcFile.FullName, destFile.FullName, true);
            }
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message + Environment.NewLine + Environment.NewLine + ex.StackTrace);
    }
}