复制文件,覆盖新文件

本文关键字:文件 覆盖 复制 新文件 | 更新日期: 2023-09-27 17:49:34

如何将文件复制到另一个位置,如果源文件比现有文件更新(有稍后的"修改日期"),则覆盖现有文件,并且如果源文件较旧,则不做任何注意?

复制文件,覆盖新文件

您可以使用FileInfo类及其属性和方法:

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);
    }
}

您可以使用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的LastWriteTime为DateTime。所以它会复制,但在可读性上有点不足。我希望这个经过测试的代码能帮助到一些人。

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

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);
    }
}

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

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