使用两个动态位置的按钮复制整个目录

时间:2015-03-08 09:48:52

标签: c# dynamic directory copy

好的,我有一个按钮(button1),我想将静态目录复制到所选目录。基本上我有textbox1,其中添加了与不同目录相关的不同数值。我有一个字典,将字符串设置为映射,链接到textbox2到源文件夹路径的代码。 。这决定了我们从哪里复制数据。我想通过folderBrowserDialog1.ShowDialog()将这些数据复制到textbox2中选择的文件夹中;命令。如何创建字典,我把它放在textbox1的哪里,然后如何让按钮取出textbox1中的任何内容并将整个目录复制到textbox2?

private Dictionary<string, string> mapping = new Dictionary<string, string>
{
    { "111", @"C:\Program Files\Example" },
    { "112", @"C:\Program Files\Example2" },
    { "113", @"C:\Program Files\Example3" },
};

public static string[] GetFiles(string mapping);

public static void Copy(string sourceFileName, string destFileName);

private void button2_Click(object sender, EventArgs e)
{

    string destination = textBox1.Text;

    foreach (var f in Directory.GetFiles(mapping))
    {
        File.Copy(Path.Combine(mapping, f)); destination;
    }
}

2 个答案:

答案 0 :(得分:0)

以下是“如何复制整个文件目录”的回答:

使用Directory.GetFiles()(请参阅documentation)获取目录中所有文件的列表。

然后使用File.Copy()(请参阅documenation)复制单个文件:

foreach(var f in Directory.GetFiles(srcPath))
{
    File.Copy(Path.Combine(srcPath, f), dstPath);
}

<小时/>

修改

Directory.GetFiles()需要一条路径:

private void button2_Click(object sender, EventArgs e)
{
    string destination = textBox1.Text;
    string srcdir = mapping["111"];
    foreach(var f in Directory.GetFiles(srcdir))
    {
         string srcpath = Path.Combine(srcdir, f)
         File.Copy(srcpath, destination);
    }
}

答案 1 :(得分:0)

我不是100%确定我理解你的问题的细节,因为TextBox1和TextBox2的使用似乎不一致,但这是我读到的:

  • TextBox1具有字典映射到源目录的代码。
  • TextBox2具有路径(从对话框中)到目标目录。

如果这是正确的,你就近了。有些事情需要注意:

  1. 我不确定你为什么要这两行。它们看起来像方法定义,但没有实现。我认为你可以删除它们并使用等效的System.IO调用:

    public static string[] GetFiles(string mapping);

    public static void Copy(string sourceFileName, string destFileName);

  2. Directory.GetFiles(mapping)无法使用,因为mappingDictionary<string, string>,而不是string。您需要根据TextBox1中的密钥(数字代码)选择相应的值(路径),并在Directory.GetFiles()方法中使用该值。

  3. File.Copy(Path.Combine(mapping, f)); destination;是一种不正确的语法,不会编译(应该是File.Copy(Path.Combine(mapping, f), destination);。此外,您不需要将第一个参数的源路径和文件名组合为{ {1}}返回路径以及文件名(包括扩展名)。但是,您需要单独获取文件名并将其与目标文件的源路径相结合。您可以使用Path.GetFileName执行此操作。

  4. 尝试下面的代码 - 它解决了上面提到的问题,假设GetFiles是映射的来源,textBox1是对话窗口中的目标:

    textBox2

    以上代码执行以下操作:

    1. 获取源目录路径的数值。这应该对应于字典中的一个键。
    2. 根据用户在对话框中选择的值获取目标目录的路径。
    3. 检查目录中是否存在来自private void button2_Click(object sender, EventArgs e) { string source = textBox1.Text string destination = textBox2.Text; if (mappings.ContainsKey(source)) { foreach (var f in Directory.GetFiles(source)) { File.Copy(f, Path.Combine(destination, Path.GetFileName(f))); } } else { // No key was found, how you handle it will be dictated by the needs of the application and/or users. } } 的密钥。
    4. 如果是,则获取该密钥的相应值,即源目录的路径。
    5. 接下来,它遍历指定源目录中的文件,将每个文件依次复制到目标目录。请注意,textBox1(文件)用作第一个参数的源文件(因为它包含路径,因为f返回路径和文件名),目标目录是与文件名结合(通过调用Directory.GetFiles()检索)。如果在Path.GetFileName方法中单独使用f,则最终会使用Path.Combine()
    6. 如果找不到该密钥,则忽略该密钥或对其执行某些操作。
    7. 同样,上述代码基于我对您的问题的理解。如果我的理解不正确,我概述的原则仍然可以帮助您解决问题。

      **编辑**

      根据以下评论,您只需翻转sourcePath\originalPath\filenamesource的作业即可。 destination将包含与textBox2目录中的密钥对应的代码,该代码将为您提供源目录的路径。 mappings将包含目标路径。像这样:

      textBox1

      其余代码保持不变。