【问题标题】:Copy file from folder to another folder with specific file name from textbox将文件从文件夹复制到另一个具有特定文件名的文件夹从文本框中
【发布时间】:2021-12-10 11:42:55
【问题描述】:

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

当我在文本框中写入例如“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)
                {
                }

【问题讨论】:

  • 您遇到了什么错误(如果有)?
  • 我没有得到任何错误,当我单击按钮时它到目前为止不起作用,我仍然不知道如何实现第二个文本框“recetaBox”,它告诉复制哪个文件代码。
  • @"C:\To\" 已经有它的尾部反斜杠。在File.Copy(file1, dircopyTo + "\\", true); 中使用时不要添加另一个。只需使用dircopyTo。但这不是你遇到的问题,这对我来说完全不清楚。我们不会为您编写代码来从用户那里获取文件名,当您发现您将不得不使用该文件名来检查 file1 以查看它是否至少是部分匹配在复制它之前,或者最好在获取文件列表时将其用作过滤器。
  • @Ken 只是想指出 File.Copy 不接受目录作为目标;它也必须指定一个文件名
  • @CaiusJard:你显然在开始阅读之前就停止了阅读但这不是你遇到的问题。 :-)

标签: c# windows forms filecopy


【解决方案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”。您可以阅读有关采用搜索模式 in the fine manual 的 getfiles 的更多信息 - 模式匹配是非常基本的,但如果您想要任何高级的东西,例如正则表达式,甚至只是区分大小写,您需要在自己的代码中进行操作

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

【讨论】:

  • 我尝试修复,但包含 if(!fn.Contains(recetaTextBox.Text, StringComparison.OrdinalIgnoreCase)) 带有红色下划线,并带有构建错误 CS1501 方法“包含”没有重载需要 2 个参数,对此有任何建议。
  • 看起来您使用的 .net 版本没有允许您选择不区分大小写的第二个参数,所以.. 首先,您是否要区分大小写?二、你希望KL5050是什么样的搭配? KL5050.txt? KL5050hello.txt?你好KL5050.txt?你好KL5050hello.txt? (精确、StartsWith、endswith、包含等)
  • 我正在使用 .net 3.5,因为这是 Windows XP 旧系统的基本程序,现在匹配将是准确的,但如果您也可以发布包含,我将不胜感激,除非.net 3.5 不支持它。如果可能,还需要区分大小写。
  • 大小写 sensitive 可以通过删除 , StringComparison.OrdinalIgnoreCase 位,将单个参数留给 Contains 来实现。如果您想要 insensitive 您可以在 FileName 和 TextBox 上调用小写,例如 fn.ToLower().Contains(recetaTextBox.Text.ToLower()),或者您可以在 GetFiles 中使用模式,例如 GetFiles(path, "*"+recetaTextBox.Text+"*.*"),因为 Windows 文件命名是不区分大小写的。如果您想要准确,请将Contains 换成Equals
  • 我应用了更改,效果很好。谢谢@CaiusJard,感谢您的帮助。最后一个请求,如果文本框上的文本输入与任何现有文件都不匹配,则获取未找到文件消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多