【问题标题】:File copy only x file extension仅文件复制 x 文件扩展名
【发布时间】:2014-05-26 10:14:35
【问题描述】:

我有一个复制我的文件的工作方法,但我想向它添加一个额外的功能。 我只想复制这些文件扩展名:*.mp4*.LRV*.THM

您可以在下面看到有 2 个方法和一个 if.. 所以有 3 个方法(没有复制第一个方法的所有内容,因为它不相关)。

其他人告诉我,我需要补充: var extensions = new[] { ".MP4", ".LRV", ".THM" }; var files1 = Directory.GetFiles(GoPro1).Where(file => extensions.Contains(new FileInfo(file).Extension)); 对于第一个方法..但这不对我得到下一个错误:“无法从'String []'转换为'String'”

我想我需要在方法中添加一个循环:copyall。但我不知道我必须做什么样的循环。有人可以帮我解决这个问题吗?

if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {
  Locatie = dlg.SelectedPath;
  var extensions = new[] { ".MP4", ".LRV", ".THM" };
  var files1 = Directory.GetFiles(GoPro1).Where(file => extensions.Contains(new FileInfo(file).Extension));   
  Copy1(files1, Locatie + @"\" + "GoPro1");
  }

public void Copy1(string sourceDirectory, string targetDirectory){

    DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
    DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);
    //Gets size of all files present in source folder.
    GetSize(diSource, diTarget);
    maxbytes = maxbytes / 1024;

    progressBar1.Maximum = maxbytes;
    CopyAll(diSource, diTarget);
}
    public void CopyAll(DirectoryInfo source, DirectoryInfo target)
    {

        if (Directory.Exists(target.FullName) == false)
        {
            Directory.CreateDirectory(target.FullName);
        }
        foreach (FileInfo fi in source.GetFiles())
        {

            fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);

            total += (int)fi.Length;

            copied += (int)fi.Length;
            copied /= 1024;
            progressBar1.Step = copied;

            progressBar1.PerformStep();
            label1.Text = (total / 1048576).ToString() + "MB van de " + (maxbytes / 1024).ToString() + "MB gekopieërd";

            label1.Refresh();
        }
        foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
        {
            DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
            CopyAll(diSourceSubDir, nextTargetSubDir);
        }
        MessageBox.Show("Het kopieren is klaar!");
    }

【问题讨论】:

  • 我会使用更便宜的Path.GetExtension(file)而不是new FileInfo(file).Extension
  • 你的过滤器应该在CopyAll过程中。
  • Directory.GetFiles 接受通配符。将扩展名作为模式(例如 *.mp4")传递,而不是遍历所有文件。此外,您将文件名数组传递给需要文件夹名称的方法。或者您可以使用 OpenFileDialog 选择具有特定一次通话中的扩展
  • 定义 Copy1 带有两个“目录”参数,但 调用 它带有一个文件列表和一个目录 - 这就是问题所在.
  • @Hans Kesting 我明白,但我该如何解决这个问题?

标签: c# file


【解决方案1】:
var files1 = Directory.GetFiles(GoPro1).Where(file => extensions.Contains(Path.GetExtension(file));   
foreach (file in files1)     
     File.Copy(file, Locatie + @"\" + "GoPro1");

或:

var files1 = New DirectoryInfo(GoPro1).EnumerateFiles.Where(file => extensions.Contains(Path.GetExtension(file));   
Copy1(files, Locatie + @"\" + "GoPro1\")     

还有Copy 方法:

public void Copy1(IEnumerble<FileInfo> files, string targetDirectory)
{
    maxbytes = files.Sum(x => x.Lenght) / 1024;

    progressBar1.Maximum = maxbytes;        

    foreach(file in files)
    {
       file.Copy(targetDirectory + file.Name)
       ... report progress to ProgressBar
    }
}

【讨论】:

  • 您可以执行Directory.GetFiles(somePath,"*.ext"),而不是遍历所有文件
  • @user3637645 什么错误?您的代码有多个问题,尝试将数组作为字符串传递只是其中之一
【解决方案2】:

解决了!

在最后一个方法中:Copyall: foreach(source.GetFiles("*.MP4") 中的 FileInfo fi) {

                fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);

                total += (int)fi.Length;

                copied += (int)fi.Length;
                copied /= 1024;
                progressBar1.Step = copied;

                progressBar1.PerformStep();
                label1.Text = (total / 1048576).ToString() + "MB van de " + (maxbytes / 1024).ToString() + "MB gekopieërd";

                label1.Refresh();
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多