在后台复制文件

本文关键字:文件 复制 后台 | 更新日期: 2023-09-27 17:56:46

当我将客户端连接到服务器时,客户端开始将一些dll文件复制到服务器。发生这种情况时,表单会卡住,直到复制完成(有一些大文件)。

我希望使此副本在后台运行,因为我希望用户能够继续与表单交互(打开一些浏览对话框等)我将确保复制完成。

我想线程在这里会有所帮助,但我是线程的新手,我也不确定这是这样做的方法。

以下是复制 dll 文件的代码:

   private bool copyDllsToServer()
    {
        //string targetPath = @"''" + remoteIpAddress + "''" + userName + batchRunPath;
        string targetPath = "Z:''nBatcher''" + userName + batchRunPath;
        if (!Directory.Exists(targetPath))
            Directory.CreateDirectory(targetPath);
        else
        {
            Directory.Delete(targetPath, true);
            Directory.CreateDirectory(targetPath);
        }

        for (int i = 0; i < listOfFilesToCopy.Count; i++)
        {
            if (listOfPathToCopy[i].CompareTo(omekPath + shadersPath) == 0)
            {
                if (!Directory.Exists(targetPath + "Shaders"))
                    Directory.CreateDirectory(targetPath + "Shaders");
                if (!File.Exists(targetPath + "Shaders''" + listOfFilesToCopy[i]))
                    File.Copy(listOfPathToCopy[i] + listOfFilesToCopy[i], targetPath + "Shaders''" + listOfFilesToCopy[i], true);
            }
            else
            {
                if (!File.Exists(targetPath + listOfFilesToCopy[i]))
                    File.Copy(listOfPathToCopy[i] + listOfFilesToCopy[i], targetPath + listOfFilesToCopy[i], true);
            }
        }
        return true;
    }    

有什么想法吗?

在后台复制文件

我会为此使用BackgroundWorker(基本上将线程池线程包装在一个不错的组件中以放在表单上,并使编组到 UI 线程更容易一些)。如果需要,您还可以使用事件来报告复制功能的进度。

有关 MSDN - http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95) 的教程,请参阅此处.aspx

不过,我要提醒一个警告。仅在单个线程中执行密集的文件操作,因为使用并发线程可能会遇到磁盘 I/O 问题。

        var bg = new BackgroundWorker();
        bg.DoWork += (s1,e1) => copyDllsToServer();
        bg.RunWorkerAsync();