编程语言
首页 > 编程语言> > 在C#中复制大量数据的方法

在C#中复制大量数据的方法

作者:互联网

我使用以下方法将目录的内容复制到不同的目录.

public void DirCopy(string SourcePath, string DestinationPath)
    {
        if (Directory.Exists(DestinationPath))
        {
            System.IO.DirectoryInfo downloadedMessageInfo = new DirectoryInfo(DestinationPath);

            foreach (FileInfo file in downloadedMessageInfo.GetFiles())
            {
                file.Delete();
            }
            foreach (DirectoryInfo dir in downloadedMessageInfo.GetDirectories())
            {
                dir.Delete(true);
            }
        }



        //=================================================================================
        string[] directories = System.IO.Directory.GetDirectories(SourcePath, "*.*", SearchOption.AllDirectories);

        Parallel.ForEach(directories, dirPath =>
        {
            Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath));
        });

        string[] files = System.IO.Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories);

        Parallel.ForEach(files, newPath =>
        {
            File.Copy(newPath, newPath.Replace(SourcePath, DestinationPath), true);
        });

    }

我唯一的问题是源路径中有相当多的数据,并且在进行复制时程序变得没有响应.

我想知道我的选择是什么用于复制数据.我做了一些研究,有人建议使用缓冲区.

我没有真正看到任何我理解得特别好的解决方案,所以任何明确和简洁的帮助/资源都会很棒.

谢谢你的帮助!

解决方法:

在Windows窗体中执行长任务,在消息线程上将导致表单无响应,直到任务完成.您将需要使用线程来防止这种情况发生.它可能会变得复杂,但您需要一个BackgroundWorker:

_Worker = new BackgroundWorker();
_Worker.WorkerReportsProgress = true;
_Worker.DoWork += Worker_DoWork;
_Worker.ProgressChanged += Worker_ProgressChanged;
_Worker.RunWorkerAsync();

一种预先完成任务的方法:

private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    worker.ReportProgress(1);

    // do stuff

    worker.ReportProgress(100);
}

以及报告进度的方法:

private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    switch (e.ProgressPercentage)
    {
        case 1:
            // make your status bar visible
            break;

        case 100:
            // hide it again
            break;
    }
}

您可以使用选取框进度条,但如果要报告实际百分比,则计算Worker_DoWork方法中的文件大小和进度可能会变得复杂,这是另一个问题.

https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx

标签:c,file-copying,directoryservices,large-data
来源: https://codeday.me/bug/20190717/1488526.html