通过本地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给出的答案,我试图压缩文件。 传统上,作为最终用户,我们使用压缩文件然后复制。作为程序员,我们可以并行压缩和复制文件吗?我的意思是拉链的部分是通过电线发送的吗?
答案 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并每次都建立新的连接等。