【问题标题】:copy files and directories recursively if files are newer (update routine)如果文件较新,则递归复制文件和目录(更新例程)
【发布时间】:2019-04-03 06:55:13
【问题描述】:

到目前为止,我的代码运行良好。 但不幸的是,我的源目录可以动态地改变它的结构。 是否有任何更小更智能的代码来递归获取文件和目录并将它们复制到新目录? 我必须分开文件和目录吗?

任何建议都会非常友好。

谢谢。

public void CopyDirFilesRecurse()
{
    // copy alle files from source (copy if newer or not existing)
    var files = Directory.GetFiles(@"\\cifsShare\source");
    var destDir = @"C:\newdir";
    foreach (var file in files)
    {
        FileInfo fileName = new FileInfo(file);
        FileInfo destFile = new FileInfo(Path.Combine(destDir, fileName.Name));
        if (destFile.Exists)
        {
            if (fileName.LastWriteTime > destFile.LastWriteTime)
            {
                fileName.CopyTo(destFile.FullName, true);
            }
        }
        else
        {
            fileName.CopyTo(destFile.FullName);
        }
    }

    // get all dirs (create if not existing
    //      copy all files from source)
    // if dir exist copy alle files from source (copy if newer or not existing)
    var directories = Directory.GetDirectories(@"\\cifsShare\source");
    foreach (var dir in directories)
    {
        DirectoryInfo dirName = new DirectoryInfo(dir);
        DirectoryInfo destDirName = new DirectoryInfo(Path.Combine(destDir, dirName.Name));
        if (!destDirName.Exists)
        {
            System.IO.Directory.CreateDirectory(destDirName.FullName);
            var filesInDir = Directory.GetFiles(dirName.FullName);
            var destDirPath = destDirName.FullName;
            foreach (var file in filesInDir)
            {
                FileInfo fileName = new FileInfo(file);
                FileInfo destFile = new FileInfo(Path.Combine(destDirPath, fileName.Name));
                if (!destFile.Exists)
                {
                    fileName.CopyTo(destFile.FullName);
                }
            }
        }
        else
        {
            var filesInDir = Directory.GetFiles(dirName.FullName);
            var destDirPath = destDirName.FullName;
            foreach (var file in filesInDir)
            {
                FileInfo fileName = new FileInfo(file);
                FileInfo destFile = new FileInfo(Path.Combine(destDirPath, fileName.Name));
                if (destFile.Exists)
                {
                    if (fileName.LastWriteTime > destFile.LastWriteTime)
                    {
                        fileName.CopyTo(destFile.FullName, true);
                    }
                }
                else
                {
                    fileName.CopyTo(destFile.FullName);
                }
            }
        }
    }
}

编辑:

我想我快到了。 我找到了一种从源递归获取所有文件的方法。 我现在的问题是我的代码正在从源子目录复制到我的目标根目录,而不是复制到新的目标子目录。

应该是这样的:

C:\source\a.txt
C:\source\subidr1\b.txt
C:\source\subidr2\c.txt

C:\dest\a.txt
C:\dest\subidr1\b.txt
C:\dest\subidr2\c.txt

但它去

C:\dest\a.txt
C:\dest\b.txt
C:\dest\c.txt

这是我的代码:

void Test()
        {                
            var sourcePath = @"C:\sourcedir";
            var destinationPath = @"C:\newdir";
            string[] allFilesSoure = Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories);
            foreach (var sourceFile in allFilesSoure)
            {
                FileInfo InfoSourceFile = new FileInfo(sourceFile);
                Debug.WriteLine(InfoSourceFile.FullName);
                var newDestinationPath = Path.Combine(destinationPath, InfoSourceFile.Name);
                string[] destinationFile = Directory.GetFiles(destinationPath, $"{InfoSourceFile.Name}", SearchOption.AllDirectories);
                if (destinationFile.Length == 1)
                {
                    FileInfo InfoDestinationFile = new FileInfo(destinationFile[0]);
                    if (InfoSourceFile.LastWriteTime > InfoDestinationFile.LastWriteTime)
                    {
                        InfoSourceFile.CopyTo(InfoDestinationFile.FullName, true);
                    }
                }
                else
                {
                    InfoSourceFile.CopyTo(newDestinationPath);
                }
            }
        }

【问题讨论】:

    标签: c# file-copying system.io.file


    【解决方案1】:

    解决将源子目录复制到目标根目录,您可以使用以下内容:

        public static void Copy(string sourceDir, string targetDir)
        {
            foreach (var file in Directory.GetFiles(sourceDir))
            {
                File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)));
            }
            foreach (var _sourceDir in Directory.GetDirectories(sourceDir))
            {
                var _targetPath = Path.Combine(
                            targetDir,
                            Path.GetFileName(_sourceDir)
                            );
    
                if (!Directory.Exists(_targetPath))
                {
                    Directory.CreateDirectory(_targetPath);
                }
                FileOps.Copy(_sourceDir, _targetPath);
            }
        }
    

    【讨论】:

    • 为什么是负面的?请添加cmets
    • 这不是这个问题的答案,你忘记了“如果文件更新”的部分!
    • 查看 OPs 最新更新,以及我帖子的第一行
    • 更具体的My problem now is that my code is copying from the source-subdirs to my destination root-dir and not to the new destination-subdir.
    • 这不起作用。此外,如果有的话,这将不会面临创建子子目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2021-06-28
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多