将具有特定扩展名的文件及其父文件夹复制到目标文件夹c#

时间:2019-06-20 14:27:49

标签: c# winforms

我正在尝试解决我为加速工作而编写的应用程序的问题。这个想法是基于文件扩展名,使用WinForm应用程序自动组织我的文件夹结构(将文件从源文件夹复制到目标文件夹)。问题是我最近开始使用C#进行编码,但找不到在文件夹结构中处理嵌套重复文件的方法。

树形结构示例

|   Analysis.xls
|   Handoff request.msg
|   Reference documentation.doc
|   
\---Trados package
    +---DE
    |       Translation text.sdlxliff
    |       
    +---EN
    |       Translation text.sdlxliff
    |       
    +---FR
    |       Translation text.sdlxliff
    |       
    +---SV
    |       Translation text.sdlxliff
    |       
    \---TM
        +---DE
        |       Ref TM.sdltm
        |       
        +---FR
        |       Ref TM.sdltm
        |       
        \---SV
                Ref TM.sdltm

我已经设法编译了一个解决方案(基于这里的一些好的建议)来帮助我解决唯一文件的问题,但是我无法处理嵌套在语言文件夹中的重复文件。

{
    var sourcePath = @"C:\Users\Home\Desktop\source";
    var targetPath = @"C:\Users\Home\Desktop\target";
    var extensions = new[] { ".sdlxliff", ".mqxliff", ".sdltm", ".tmx" };

    var files = (from file in System.IO.Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
                 where extensions.Contains(System.IO.Path.GetExtension(file), StringComparer.InvariantCultureIgnoreCase)
                 select new
                 {
                     Source = file,
                     Destination = System.IO.Path.Combine(targetPath, System.IO.Path.GetFileName(file))
                 });
    {
        foreach (var file in files)
            File.Copy(file.Source, file.Destination);

        MessageBox.Show("Done", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information);

预期结果是将复制的文件和其父文件夹一起复制到目标文件夹中(即,如果我要从源目录“ C:\ Users \ Home \ Desktop \ source”复制Translation text.sdlxliff \ Trados包\ DE”,则应将文件添加到以下目标文件夹“ C:\ Users \ Home \ Desktop \ target \ Trados包\ DE”中。TM文件夹和所有嵌套文件也应如此在里面。

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

不是将目标路径与源文件名组合在一起,而是将源基本文件夹完全替换为目标基本文件夹:

Destination = file.Replace(sourcePath, targetPath)

然后,在复制之前,请确保目录存在:

foreach (var file in files)
{
    Directory.CreateDirectory(Path.GetDirectoryName(file.Destination));
    File.Copy(file.Source, file.Destination);
}

如果目录已经存在,CreateDirectory将返回而不会出现错误。

或者,请参见用于复制this related answer中的整个目录的通用解决方案