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

时间:2012-09-19 07:56:06

标签: c# asp.net algorithm

通过本地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;
        }

修改

根据Thomas给出的答案,我试图压缩文件。 传统上,作为最终用户,我们使用压缩文件然后复制。作为程序员,我们可以并行压缩和复制文件吗?我的意思是拉链的部分是通过电线发送的吗?

2 个答案:

答案 0 :(得分:2)

你在嵌套循环中做了太多工作。

你应该删除内部的“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))
    {
        ...
    }
}

答案 1 :(得分:1)

我建议在移动之前压缩文件。试着看看非常简单的http://dotnetzip.codeplex.com/

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