0

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

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

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

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

我到目前为止的代码有两个文本框,第一个叫做 serieBox,一个只需要输入数据(如果为空打开一个窗口),然后继续下一个框,然后下一个框命名为 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)
                {
                }
4

1 回答 1

1

您唯一不完全清楚的是 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);
}

带走点:

  • 做一些检查,如包含、StartsWith、EndsWith 等

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

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

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

  • 如果您想要稍微提高效率,您可以使用 的内容recetaTextBox.Text来形成 GetFiles 的过滤器,例如GetFiles(dircopyFrom, recetaTextBox.Text+"*.*")- 这在概念上等同于“StartsWith”。您可以在详细手册中阅读有关采用搜索模式getfiles 的更多信息- 模式匹配是非常基本的,但如果您想要任何高级的东西,如正则表达式,甚至只是区分大小写,您需要在自己的代码中进行

  • 您要复制到的目录必须存在。我没有在代码中添加任何内容来确保这一点,但请注意,Directory.CreateDirectory(dirCopyTo)即使它已经存在,调用也是安全的,所以如果目录可能不存在,你可以在调用 copy 之前调用 CreateDirectory 以确保它做

于 2021-10-25T05:32:11.783 回答