2013-01-15 110 views
0

我之前發佈過這個,但不得不刪除這個問題,因爲我解釋得非常糟糕,對那些以前可能已經閱讀過的人感到抱歉。讓我更加清楚。我通過指定三樣東西來創建一個WinForm的應用程序,它允許從一個目錄複製到另一個文件:遞歸?或者如何不斷獲得父母的父母?

  1. 凡從(txtPath)
  2. 複製什麼文件擴展名複製(你指定的人是那些被複制)(txtExtensions)
  3. 哪裏複製到(txtArchiveTo)

視覺上看起來是這樣的:

enter image description here

從txtPath到txtArchiveTo的副本必須與其複製方式相匹配。也就是說,如果txtPath如下所示:

c:\temp 
    | 
    -drivers.exe (file) 
    -log.txt (file) 
    -\Test1 (directory) 
    -\Test2 (directory) 

然後,如果我選擇txtArchiveTo如文件夾c:\backup結果應該是我的程序運行後,它應該是這樣的:

c:\backup 
    | 
    -\temp 
     | 
     -drivers.exe (file) 
     -log.txt (file) 
     -\Test1 (directory) 
     -\Test2 (directory) 

也就是說無論是複製需要遵循相同的結構......但我很難編碼,因爲它看起來好像我一直在參考root.Parent.Parent等。讓我發佈一些代碼:

Go按鈕很簡單:

private void btnGo_Click(object sender, EventArgs e) 
{ 
    DirectoryInfo di = new DirectoryInfo(txtPath.Text); 
    WalkDirectoryTree(di); 
} 

這只是創建一個DirectoryInfo對象,所以我有一個句柄txtPath目錄,並調用一個函數WalkDirectoryTree。這個功能看起來是這樣的:

private void WalkDirectoryTree(DirectoryInfo root) 
     { 
      System.IO.FileInfo[] files = null; 
      System.IO.DirectoryInfo[] subDirs = null; 

      string[] extArray = txtExtensions.Text.Split(' '); //to hold the txtExtensions as an array string { "txt" "tar" "zip" etc.. } 
      string ext; //to hold the extension 

      // First, process all the files directly under this folder 
      try 
      { 
       files = root.GetFiles("*.*"); 
      } 
      catch (UnauthorizedAccessException e) 
      { 
       throw; //todo: log this later on... 
      } 
      catch (System.IO.DirectoryNotFoundException e) 
      { 
       Console.WriteLine(e.Message); 
      } 

      if (files != null) 
      { 
       foreach (System.IO.FileInfo fi in files) 
       { 
        string extension = fi.Extension.ToString(); 
        if (extension.IndexOf(".") > -1) 
         ext = extension.Substring(1, extension.Length-1); 
        else 
         ext = extension; 

        if (extArray.Any(s => ext.Contains(s))) 
        {  
         //copy the file 
         if (Directory.Exists(txtArchiveTo.Text + "\\" + fi.Directory.Name)) 
          { 
           //directory exists copy the files 
          } 
          else 
          { 
           Directory.CreateDirectory(txtArchiveTo.Text + "\\" + fi.Directory.Name); 
          } 

          File.Copy(fi.FullName, txtArchiveTo.Text + "\\" + fi.Directory.Name + "\\" + fi.Name);      

         //create a shortcut pointing back to the file... 
         using (ShellLink shortcut = new ShellLink()) 
         { 
          shortcut.Target = fi.FullName; 
          //shortcut.Description = "MY SHORTCUT"; 
          shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal; 
          shortcut.ShortCutFile = fi.DirectoryName + "\\" + fi.Name + ".lnk"; 
          shortcut.Save(); 
         } 
        } 

       } 

       // Now find all the subdirectories under this directory. 
       subDirs = root.GetDirectories(); 

       foreach (System.IO.DirectoryInfo dirInfo in subDirs) 
       { 
        // Resursive call for each subdirectory. 
        WalkDirectoryTree(dirInfo); 
       } 
      }    
     } 

請不要太注意,我創建一個快捷方式的代碼,等等。這部分是沒有問題的。什麼我有困難時,我打的幾行代碼:

​​

if簡單地檢查,如果該文件的分機的用戶鍵入的txtExtensions這裏面可以確保我們只複製匹配帶有這些擴展名的文件,但在它們被發現的文件夾中。我的問題是之後,如果......我不能只是說:

Directory.CreateDirectory(txtArchiveTo.Text + "\\" + fi.Directory.Name);

之所以存在是存檔文件夾必須爲正在複製什麼相同的文件夾路徑相匹配。因此,例如,如果某人選擇了c:\ temp來搜索並找到要從中複製的txt文件,並且他們選擇了一個文件夾c:\ backup來複制到c:\ temp,但有三個子文件夾(一,二和三)文本文件。結果將會是,在我的程序運行後(完成「Go」),結果將是歸檔文件夾c:\ backup將包含其中包含txt文件的文件夾(一,二和三) ,c:\ backup \ One \ mytest.txt等。

我想在我當前的代碼將這一,覺得我真的很接近,但認爲我需要拿出一些recurrision以得到正確的目錄結構。請不要張貼我關於如何使用Directory.CreateDirectory或FileInfo類的MSDN鏈接,我已閱讀並理解它們。

+0

@DJKRAZE這不是我的問題......我知道如何遞歸複製文件。問題是,因爲我第一次得到files..then如果目錄顯示它回顧WalkDirectoryTree,這是在那裏可以得到質樸,因爲目錄必須是在同一水平txtPath ... – oJM86o

+0

該如何保持正確的路徑當前路徑應該在一個變量舉行。現在,如果你是在當前目錄下,你應該再抱基於該擴展到一個數組或列表中的文件和迭代該列表在循環中的foreach循環,那麼你做副本這是否有道理..? – MethodMan

+0

ispiro - 我的問題是,我該怎麼辦複製......因爲只要我打一個新的目錄和「WalkDirectoryTree()」我有一個新的根......基本上是副本應匹配,但走在一個新的位置,看到我現有的代碼,我可以在那裏做什麼來解決它...... – oJM86o

回答

2

傳遞目標文件夾中的參數設置爲你的行走功能:

private void WalkDirectoryTree(DirectoryInfo root, string DestinationFolder) 

然後,當你複製文件,你可以只使用了FileInfo的CopyTo方法:

 fi.CopyTo(DestinationFolder) 

當調用next方法遞歸,只需將它添加到desintation路徑:

foreach (System.IO.DirectoryInfo dirInfo in subDirs) 
    { 
     // Resursive call for each subdirectory. 
     WalkDirectoryTree(dirInfo, System.IO.Path.Combine(DestinationFolder, dirInfo.Name)); 
    } 

進行初始調用時,需要計算輸出目錄:

string path = txtPath.Text; 
string outputDir = txtArchiveTo.Text 
string finalDir = System.IO.Path.Combine(outputDir, path.Remove(0, System.IO.Path.GetPathRoot(path).Length)); 

DirectoryInfo di = new DirectoryInfo(txtPath.Text); 
WalkDirectoryTree(di, finalDir); 
+0

這類作品......但想象這個結構'c:\ temp \ test1'作爲txtPath的'txtArchive'包含'C:\ backup',使用你的代碼後的結果是'C:\備份\ test1'但它應該是'C:\備份\ TEMP \ test1' – oJM86o

+0

@ oJM86o然後你指定C:\ backup \ temp作爲初始調用WalkDirectoryTree的根目錄 –

+0

@JohnKoerner我明白了t帽子,但用戶將選擇只是說c:\備份。他或她永遠不會記得放在c:\ backup \ temp中。沒有辦法自動給它第一個遇到的文件夾。 Temp只是這個變化的一個例子... – oJM86o