将文件从文件夹复制到文本框中具有特定文件名的另一个文件夹

Copy file from folder to another folder with specific file name from textbox

我正在尝试为具有此特定功能的文件创建一个复制按钮:

当我在文本框中写入例如“KL5050”然后按下复制按钮时,我想从特定文件夹复制文件 KL5050 并将其粘贴到另一个特定文件夹而不询问或打开任何对话框或 window,只需单击、复制和粘贴。

文件格式无关紧要,可以是 TXT、doc、PDF、JPEG 等,只要它与文本框中的文本与将复制到的文件夹中的任何现有文件匹配即可另一个文件夹。

此外,如果复制文件夹中不存在该文件,则会收到“找不到文件”的警告。

我目前的代码有两个文本框,第一个叫做 serieBox,在进入下一个框之前只需要输入数据(如果为空打开 window),然后是下一个box 名为 recetaBox,我在其中键入文件名,然后单击按钮,程序将查找该文件并将其复制到不同的文件夹。到目前为止我不知道第二个盒子recetaBox放在哪里。还没有在代码中。

private void cargarButton_Click(object sender, EventArgs e)
        {
            if (serieBox.Text == string.Empty)
            {
                SerieWin openForm = new SerieWin();
                openForm.ShowDialog();
            }
            else
            {
                try
                {
                    string dircopyFrom = @"C:\From\";
                    string dircopyTo = @"C:\To\";
                    string[] files = Directory.GetFiles(dircopyFrom);

                    foreach (string file1 in files)
                    {
                            string filename1 = Path.GetFileName(file1);
                            File.Copy(file1, dircopyTo + "\", true);
                    }
                }
                catch (Exception ex)
                {
                }

您唯一没有完全弄清楚的是 KL5050 是文件名的开头、结尾、全部还是一部分,但很容易修复

  string[] files = Directory.GetFiles(dircopyFrom);

  foreach (string file in files)
  {
    var fn = Path.GetFileNameWithoutExtension(file);
    
    if(!fn.Contains(recetaTextBox.Text, StringComparison.OrdinalIgnoreCase))
      continue;

    fn = Path.GetFileName(file);
    File.Copy(file, Path.Combine(dircopyTo, fn), true);
  }
} catch(Exception ex){
  MessageBox.Show(ex.Message);
}

带走积分:

  • 做一些检查,比如 Contains、StartsWith、EndsWith 等

  • 使用Path.Combine构建路径; .net 不仅仅在 windows 上运行,而且不同的系统具有不同的目录分隔符

  • File.Copy 采用的目标路径也必须包含一个文件名,而不仅仅是一个目录。目标文件可以在复制过程中通过调整名称重命名

  • 永远不要放置空的 catch 块。至少 总是 做一个 MessageBox.Show(ex.Message); 特别是处理文件。有一个程序在单击按钮时什么都不做是非常令人沮丧的。如果至少你在尝试复制时得到一个“文件正在被另一个程序使用”,那么你可以做一些事情......但是如果你吞下那个异常并将它扔掉而不是浮出水面那么你就会有一个真正的很难找到任何问题

  • 如果你想要稍微提高效率,你可以使用 recetaTextBox.Text 的内容来形成 GetFiles 的过滤器,例如 GetFiles(dircopyFrom, recetaTextBox.Text+"*.*") - 这在概念上等同于“StartsWith” .您可以阅读更多关于采用搜索模式 in the fine manual 的 getfiles - 模式匹配是非常基本的,如果您想要任何高级的东西,如 Regex,甚至只是区分大小写,您需要在自己的代码中完成

  • 您要复制到的目录必须存在。我没有在代码中放置任何东西来确保这一点,但请注意调用 Directory.CreateDirectory(dirCopyTo) 是安全的,即使它已经存在,所以如果目录有可能不存在,您总是可以在调用之前调用 CreateDirectory复制以确保它确实如此