2012-09-19 49 views
1

雖然通過本地局域網共享複製大約50 GB的數據,由於連接問題拷貝失敗大約10 GB複製。複製文件的C#代碼,可以改進此片段嗎?

我已重命名複製的數據目錄的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; 
     } 

編輯:

基於由托馬斯給我試圖壓縮文件的答案。 傳統上作爲最終用戶,我們使用來壓縮文件,然後複製。作爲程序員,我們可以並行壓縮和複製文件嗎?我的意思是已經壓縮的部分通過電線發送它?

+5

類似這樣的問題應該問的[代碼審查(http://codereview.stackexchange.com) –

回答

2

你正在做嵌套循環太多的工作。

您應取下內「的foreach」,並與一些代碼,替換:

(1)建設的文件,你正在尋找的名稱和

(2)使用File.Exists ()來查看是否存在,那麼

(3)與您當前擁有以下相同的代碼塊延續了「如果(Path.GetFileName(remoteSrcFile)...」狀態。

像這樣的東西:

foreach (string remoteSrcFile in Directory.EnumerateFiles(remoteRepository, "*.*", SearchOption.AllDirectories)) 
{ 
    string localSrcFile = Path.Combine(localRepository, Path.GetFileName(remoteSrcFile)); 

    if (File.Exists(localSrcFile)) 
    { 
     ... 
    } 
} 
+0

同意的建議,我不得不使用內循環,以確保如果任何文件已被移動到不同的文件夾進行迭代遠程PC ..它可能位於我的localRepository中的不同文件夾中,File.Exists(localSrcFile)不會返回true。 +1 – Abhijeet

1

我建議移動之前壓縮和解文件。試試看看非常簡單的http://dotnetzip.codeplex.com/

嘗試一次壓縮1000個文件,這樣,您不必每次運行for-loop多次並建立新的連接等。

+0

感謝您增加新視角。 +1。你是否建議在內部壓縮文件並在複製後解壓縮它們? – Abhijeet

+0

傳統上,我們用作壓縮文件然後複製的最終用戶。作爲程序員,我們可以並行壓縮和複製文件嗎?我的意思是已經壓縮的部分通過電線發送它? – Abhijeet

+0

是的,我用來壓縮,然後在位置解壓縮。對不起,無法回答你的第二個答案。但讓我們知道你是否成功。也讓知道,如果它更快:-) – Thomas

相關問題