代码之家  ›  专栏  ›  技术社区  ›  Abhijeet

C#代码复制文件,这个代码段可以改进吗?

  •  1
  • Abhijeet  · 技术社区  · 14 年前

    在通过本地LAN共享复制大约50 GB的数据时,由于连接问题,复制失败,复制了大约10 GB。

    我已经将复制的10GB数据目录重命名为localRepository,然后编写了一个C#程序将文件从远程服务器复制到目标,只有在本地存储库中找不到的情况下。如果找到,请将文件从本地存储库移动到目标文件夹。

    尽管代码运行良好,并且很好地完成了任务。我想知道,我写了最有效的代码吗?你能找到什么改进吗?

    string destinationFolder = @"C:\DataFolder";
            string remoteRepository = @"\\RemoteComputer\DataFolder";
            string localRepository = @"\\LocalComputer\LocalRepository";
    
            protected void Page_Load(object sender, EventArgs e)
            {
                foreach (string remoteSrcFile in Directory.EnumerateFiles(remoteRepository, "*.*", SearchOption.AllDirectories))
                {
                    bool foundInLocalRepo = false; ;
                    foreach (var localSrcFile in Directory.EnumerateFiles(localRepository, "*.*", SearchOption.AllDirectories))
                    {
    
                        if (Path.GetFileName(remoteSrcFile).Equals(Path.GetFileName(localSrcFile)))
                        {
                            FileInfo localFile = new FileInfo(localSrcFile);
                            FileInfo remoteFile = new FileInfo(remoteSrcFile);
    
                            //copy this file from local repository
                            if (localFile.Length == remoteFile.Length)
                            {
                                try
                                {
                                    File.Move(localSrcFile, PrepareDestinationPath(remoteSrcFile));
                                    Debug.WriteLine(remoteSrcFile + " moved from local repo");
                                }
                                catch (Exception ex)
                                {
                                    Debug.WriteLine(remoteSrcFile + " did not move");
                                }
                                foundInLocalRepo = true;
                                break;
                            }
                        }
                    }
                    if (!foundInLocalRepo)
                    {
                        //copy this file from remote repository
                        try
                        {
                            File.Copy(remoteSrcFile, PrepareDestinationPath(remoteSrcFile), false);
                            Debug.WriteLine(remoteSrcFile + " copied from remote repo");
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine(remoteSrcFile + " did not copy");
                        }
    
                    }
                }
            }
    
            private string PrepareDestinationPath(string remoteSrcFile)
            {
                string relativePath = remoteSrcFile.Split(new string[] { "DataFolder" }, StringSplitOptions.None)[1];
                string copyPath = Path.GetFullPath(destinationFolder + relativePath);
                Directory.CreateDirectory(Path.GetDirectoryName(copyPath));
                return copyPath;
            }
    

    编辑:

    根据托马斯给出的答案,我正试图压缩文件。 传统上,作为最终用户,我们使用压缩文件,然后进行复制。作为一名程序员,我们能并行地压缩和复制文件吗?我的意思是,已经拉上拉链的部分通过电线发送?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Matthew Watson    14 年前

    您使用嵌套循环做的工作太多了。

    您应该删除内部的“foreach”,并将其替换为以下代码:

    (1) 构造您要查找的文件的名称,并

    (2) 使用File.Exists()查看是否存在,然后

    (3) 按照“if(Path.GetFileName(remoteSrcFile)…”条件继续使用当前具有的相同代码块。

    类似于以下内容:

    foreach (string remoteSrcFile in Directory.EnumerateFiles(remoteRepository, "*.*", SearchOption.AllDirectories))
    {
        string localSrcFile = Path.Combine(localRepository, Path.GetFileName(remoteSrcFile));
    
        if (File.Exists(localSrcFile))
        {
            ...
        }
    }
    
        2
  •  1
  •   Thomas    14 年前

    我建议在搬家前把文件压缩一下。试着看看非常简单的 http://dotnetzip.codeplex.com/

    尝试一次压缩1000个文件,这样,您就不必多次运行for循环并每次建立新的连接等。