使用字节复制文件+进度条

时间:2011-12-11 20:24:10

标签: c# copy progress-bar byte

我正在尝试在我的文件复制表单上取得进展,让它工作但进度条根据文件数量更新。问题是有很多小文件,还有一些非常大的文件需要复制。

所以我想知道是否有办法检查写入的字节数而不是使用文件号。 任何建议都非常感谢。这是我现在的代码:

    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        string SourcePath = RegistryRead.ReadOriginalPath();
        string DestinationPath = RegistryRead.ReadNewPath();

        if (Directory.Exists(SourcePath))
        {
            //Now Create all of the directories 
            string[] allDirectories = Directory.GetDirectories(SourcePath, "*", SearchOption.AllDirectories);
            string[] allFiles = Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories);
            int numberOfItems = allDirectories.Length + allFiles.Length;
            int progress = 0;

            foreach (string dirPath in allDirectories)
            {
                Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath));
                progress++;
                BackgroundWorker.ReportProgress(100 * progress / numberOfItems);
            }

            //Copy all the files 
            foreach (string newPath in allFiles)
            {
                File.Copy(newPath, newPath.Replace(SourcePath, DestinationPath));
                progress++;
                BackgroundWorker.ReportProgress(100 * progress / numberOfItems);
            }
        }

    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Change the value of the ProgressBar to the BackgroundWorker progress.
        progressBar1.Value = e.ProgressPercentage;
    }

提前致谢

2 个答案:

答案 0 :(得分:1)

如果你想自己做,你可以

  1. 迭代计算要复制的总大小的所有文件。
  2. 调用CopyFileEx进行复制。这使用回调机制来报告进度,并且回调包括为当前文件复制的字节数。
  3. 跟踪总共已复制的字节数,并使用它来报告整体进度。
  4. 很可能.net管理等同于CopyFileEx。

    但是,我建议拨打SHFileOperation并让系统为您付出艰苦的努力。当你发现这个任务非常难以做好。作为使用shell完成工作的额外好处,您将获得标准系统对话框。

答案 1 :(得分:0)

您需要实现自己的文件复制代码,并从那里报告进度。

编辑: 如果您不想自己复制文件,可以启动另一个后台工作程序来检查文件复制进度(获取当前复制文件的属性,并检查其长度)。如果您没有遇到共享问题,它将为您提供更新进度条所需的信息。