【问题标题】:Copy Directory from Source to Destination depending upon selection根据选择将目录从源复制到目标
【发布时间】:2018-12-19 17:56:03
【问题描述】:

我已经实现了如下 CopyDirectoryAndFiles 功能,但它不能正常工作

案例 - 我想从源复制/创建NAC -> NAC11 -> NAC12(这是文件夹结构)到目标它只创建/复制NAC11->NAC12 我将源路径传递为 - @"C:\TestArea\Destination\SUP000001\20041202-01-0002-001\NAC 它的最后一部分 (\NAC) 在运行时从 UI 中选择要复制的文件夹,它也可以是多个文件夹,如果我只将路径传递为 @"C:\TestArea\Destination\SUP000001\20041202-01-0002-001 它从src->dest 复制所有内容,但我只想选择一个..如何在下面的代码中处理这种情况?

Main() -

    copyDirectory(@"C:\TestArea\Destination\SUP000001\20041202-01-0002-001\NAC"
,                 @"C:\TestArea\Destination\SUP000005\20150622-1205-0015-M");

Method - 

    private static void copyDirectory(string Source, string destination)
            {
                string[] Files = null;           

                if (destination[destination.Length - 1] != Path.DirectorySeparatorChar)
                {
                    destination += Path.DirectorySeparatorChar;
                }

                if (!Directory.Exists(destination))
                {
                    Directory.CreateDirectory(destination);
                }

                Files = Directory.GetFileSystemEntries(Source);
                foreach (string Element in Files)
                {
                    // Sub directories
                    if (Directory.Exists(Element))
                    {
                        copyDirectory(Element, destination  + Path.GetFileName(Element));
                    }
                    else
                    {
                        // Files in directory
                        File.Copy(Element, destination + Path.GetFileName(Element), true);
                    }
                }

            }

【问题讨论】:

  • 您的描述有点混乱。您是要尝试将源结构复制到目标还是仅将指定文件夹中的文件复制到目标?是否应该保留和复制目录结构?
  • 源结构到目的地,但取决于用户的选择,所以说用户只从源中选择了一个文件夹,如 NAC 并且使用我当前的代码它包含 (NAC->NAC11->NAC12) 它只复制 NAC11-> NAC12 ,不复制 NAC。目录结构被保留和复制(这是正确的)

标签: c# system.io.file


【解决方案1】:

如果我理解正确,您指定了以下源目录和目标目录:

var source = @"C:\TestArea\Destination\SUP000001\20041202 - 01 - 0002 - 001\NAC";
var dest = @"C:\TestArea\Destination\SUP000001\20041202-01-0002-001";

并且您想将NAC 目录(连同它的所有内容)从source 复制到destination 目录,但问题是NAC 目录的内容被直接复制到20041202-01-0002-001 文件夹,当你真的想得到如下路径时(并且这个 NAC 目录应该与源 NAC 目录相同):

@"C:\TestArea\Destination\SUP000001\20041202-01-0002-001\NAC"

如果是这种情况,那么你只需要先修改目标目录路径,在其中添加源目录的名称,如下所示:

destination = Path.Combine(destination, sourceDir.Name);

这是一个可以解决问题的代码示例:

private static void CopyDirectory(string source, string destination)
{
    var sourceDir = new DirectoryInfo(source);
    if (!sourceDir.Exists) throw new DirectoryNotFoundException(nameof(source));

    // Add last directory of source to destination and create it
    destination = Path.Combine(destination, sourceDir.Name);
    Directory.CreateDirectory(destination);

    // Copy files from source to destination
    foreach (var file in sourceDir.GetFiles())
    {
        file.CopyTo(Path.Combine(destination, file.Name));
    }

    // Recursively copy sub directories from source to destination
    foreach (var subDir in sourceDir.GetDirectories())
    {
        CopyDirectory(subDir.FullName, destination);
    }
}

【讨论】:

  • 你的代码给了我 - C:\TestArea\Destination\SUP000005\20150622-1205-0015-M\NAC\NAC11\NAC11\NAC12\NAC12 但它应该是 -> C:\TestArea\目的地\SUP000005\20150622-1205-0015-M\NAC\NAC11\NAC12
  • 哦,你是对的......我在递归调用中将名称附加到目的地,而不是让 CopyDirectory 为我做这件事,所以它加倍了它们。我已经解决了,所以请立即尝试...
猜你喜欢
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2016-08-05
  • 2017-09-25
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多