2013-03-18 88 views
0

我有下面的代碼,它掃描一個目錄,並將其文件名中包含「a」的文件放到一個新的文件夾A中。同樣,它將文件名稱爲「b」 B.由於if語句基本相同,唯一改變的是字母「a」或「b」併發送到destA或destb(desitinations),我該如何修改這些代碼?我知道有更好的方法,因爲大部分代碼都重複了......謝謝。冷凝重複如果語句

static void Main() 
{ 
    string path = @"C:\Users\me\Desktop\FOLDER"; 
    string destA = @"C:\Users\me\Desktop\FOLDER\A"; 
    string destB = @"C:\Users\me\Desktop\FOLDER\B"; 

    DirectoryInfo dir = new DirectoryInfo(path); 
    FileInfo[] filesxx = dir.GetFiles(); 
    foreach (FileInfo filexx in filesxx) 
    { 
     if (filexx.Name.Contains("a")) 
     { 
      if (!Directory.Exists(destA)) 
       Directory.CreateDirectory(destA); 
      Console.WriteLine(filexx); 
      filexx.CopyTo(Path.Combine(destA, filexx.Name), true); 
     } 
     else if (filexx.Name.Contains("b")) 
     { 
      if (!Directory.Exists(destB)) 
       Directory.CreateDirectory(destB); 
      Console.WriteLine(filexx); 
      filexx.CopyTo(Path.Combine(destB, filexx.Name), true); 
     }  
     else 
     { 
      Console.WriteLine("Other: ", filexx); 
     } 
    } 
    Console.Read(); 
} 
+2

那麼,你可以開始一個子程序,所有重複的代碼。然後弄清楚如何構建destA/destB路徑名,而不是硬編碼它們。 – 2013-03-18 19:22:27

回答

0

創建等的方法:

private Boolean MoveFile(FileInfo filexx, String nameMatch, String destDirectory) { 
    Boolean result = false; 
    if (filexx.Name.Contains(nameMatch)) { 
    if (!Directory.Exists(destDirectory)) { 
     Directory.CreateDirectory(destDirectory); 
    } 
    Console.WriteLine(filexx); 
    filexx.CopyTo(Path.Combine(destDirecotry, filexx.Name), true); 
    result = true; 
    } 
    return result; 
} 

然後只是把它作爲必要的。

foreach(FileInfo filexx in filesxx) { 
    if (!MoveFile(filexx, "a", destA)) { 
    if (!MoveFile(filexx, "b", destB)) { 
     Console.WriteLine("Other: ", filexx); 
    } 
    } 
} 

當然,這裏有一個潛在的優先問題。如果文件名爲「abcd」會怎麼樣?是否應該轉到A文件夾或B文件夾?

+0

在與分離問題相同的邏輯行中,名爲「dcba」的文件會進入相同的文件夾嗎? – CodeHxr 2013-03-18 20:06:19

+0

@CodeHxr:的確如此。對文件名中的單個字母做一個「包含」聽起來有點* off *。我希望代碼已經足夠匿名,看起來像一個真正的問題是不是真的。如果沒有,那麼我懷疑他可能需要'StartsWith'而不是'Contains' – NotMe 2013-03-18 20:07:39

0

如果你正在尋找的是更少的代碼,這應該做到這一點。

public static void Main() 
     { 
      const string TargetPath = @"C:\Users\me\Desktop\FOLDER"; 
      var dir = new DirectoryInfo(TargetPath); 
      var files = dir.GetFiles(); 
      foreach (var file in files.Where(file => !CopyFile(TargetPath, file, "a")).Where(file => !CopyFile(TargetPath, file, "b"))) 
      { 
       Console.WriteLine("Other: " + file.Name); 
      } 

      Console.Read(); 
     } 

     private static bool CopyFile(string dir, FileInfo file, string match) 
     { 
      if (!file.Name.Contains(match)) 
      { 
       return false; 
      } 

      dir = dir + "\\" + match.ToUpper(); 
      if (!Directory.Exists(dir)) 
      { 
       Directory.CreateDirectory(dir); 
      } 

      Console.WriteLine(file); 
      file.CopyTo(Path.Combine(dir, file.Name), true); 
      return true; 
     }