【问题标题】:If copying files from and to network drive location with my C# tool, it is EXTREMELY SLOW, why?如果使用我的 C# 工具将文件从网络驱动器位置复制到网络驱动器位置,速度非常慢,为什么?
【发布时间】:2015-08-27 16:25:01
【问题描述】:

在我的工具中,我内置了一项功能,可以将文件从用户指定的位置复制到另一个位置。如果我从基于网络驱动器的位置复制并复制到该位置,则复制一个 2 kb 的文件大约需要 10 分钟。这不是网络问题,因为不使用该工具也可以正常工作。

期望:将文件从一个网络位置复制到另一个位置的工具。

会发生什么:一个 1 kb 的文件需要 10 多分钟才能复制。如果我从本地驱动器到网络位置执行此操作,或者反之亦然,那就更好了。

这是我的复制代码:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    if (!string.IsNullOrWhiteSpace(fedPREVIEW.Text))
    if (!string.IsNullOrWhiteSpace(pathofsrcfilesTOCOPY.Text))
    if (!string.IsNullOrWhiteSpace(foldercreationPATH.Text))
    {  

        for (int i = 1; i <= 100; i++)
        {
            string sourcePath = @pathofsrcfilesTOCOPY.Text;
            string targetPath = foldercreationPATH.Text + "\\01_SR";
            if (!Directory.Exists(targetPath))
            {
                Directory.CreateDirectory(targetPath);
            }

            //Copy the folders from sourcepath and place into mentioned target path, 
            //Overwrite the folder if same file is exist in target path
            foreach (string srcPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
            {
                Directory.CreateDirectory(srcPath.Replace(sourcePath, targetPath));
            }

            //Copy the file from sourcepath and place into mentioned target path, 
            //Overwrite the file if same file is exist in target path + it also copies subfolders and files from folders.
            foreach (var srcPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories))
            {
                System.IO.File.Copy(srcPath, srcPath.Replace(sourcePath, targetPath), true);
            }

            // Report progress.
            backgroundWorker1.ReportProgress(i);
        }
    }
}

【问题讨论】:

  • 请修正你的缩进。这几乎不可读
  • 你可以用if(A &amp;&amp; B &amp;&amp; C)代替if(A) if(B) if(C)。这是更被接受的风格。
  • 您所做的不仅仅是在此处复制文件。我建议分析或检测您的代码,以确定哪些行占用了大部分时间。
  • 你为什么要做这个工作100次? for (int i = 1; i

标签: c# file-transfer file-copying


【解决方案1】:

您在这里做了 100 次相同的事情(即,按照您所说的“复制文件”执行 100 次)。

但您说问题在于复制一个文件,而提供的源显示完整的路径复制(创建目录然后复制所有文件...... 100 次!)。

只需调试您的代码,看看它在做什么...如果 single System.IO.File.Copy 对 2kb 文件的操作需要 10 分钟,那么您的问题是正确的...正如您发布的那样它,要么问题是错误的,要么你的测量是错误的,因为你的代码所做的不仅仅是复制一个文件(......而且它做了 100 次!)

... 100 次!

【讨论】:

  • @AndreasWard 是的... 100 次!所以难怪它需要很长时间 :-) 即使 foreach 只包含一个文件,你的工作人员也会做同样的事情 100 次(由于它被封闭在 for(int i = 1; i &lt;= 100; i++) 块上。
  • 哦,我以为进度条部分是这样的(比如将 100% 作为最大值)。抱歉,我不是一个 11 岁的开发者,他正在做实验……不过,我并不是说一切都很清楚。 :(谢谢你的帮助,我会试一试,看看实际上是什么。
  • 您的 for 块对其中的所有内容重复操作 100 次,括在括号 { } 中(包括所有目录创建和文件复制操作)
  • 如果您想报告从 1 到 100 的进度,您应该在复制文件的 foreach 块中执行此操作(首先计算要复制的文件数)复制,然后在您迭代它们执行实际复制操作时传递百分比),而不是为了它而重复整个操作 100 次 :-)
  • 如果通过File.Copy 进行复制操作,则无法报告单个文件的进度。您可以报告正在复制的文件的百分比(如果有多个),但不能报告“在复制操作中”。有办法做到这一点,但这超出了这个问题的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 2021-12-21
  • 2010-10-04
  • 2013-12-07
相关资源
最近更新 更多