2016-11-08 120 views
0

如果重複,我很抱歉。請指向正確的方向。我有2個目錄Dir1和Dir2。我在Dir1中有一個文件,在Dir2中有兩個文件。C#:從兩個不同的目錄中刪除所有文件或不刪除

Dir1 
-Dir1File1.txt 

Dir2 
-Dir2File1.txt 
-Dir2File2.txt 

現在我需要刪除Dir1和Dir2中的所有文件。我需要刪除所有文件或無,也就是說,如果我成功刪除Dir1中的文件並嘗試刪除Dir2中的文件,並且如果發生錯誤,那麼我必須在Dir1中回滾我的刪除。

SOLUTION

不是創建和刪除臨時文件夾這是我做的。我用字典來跟蹤我的文件全名和我想刪除的數據。

private static void DeleteAllFilesOrNone() 
    { 
     string featuresFolder = @"C:\SCD_Sample\Dir1"; 
     string cfxFolder = @"C:\SCD_Sample\Dir2"; 

     Dictionary<string, string> featuresFileInfo = new Dictionary<string, string>(); 
     Dictionary<string, string> cfxFileInfo = new Dictionary<string, string>(); 
     List<Dictionary<string, string>> list = new List<Dictionary<string, string>>(); 

     bool rollbackFileDeleteNeeded = false; 
     try 
     { 
      DirectoryInfo featuresDir = new DirectoryInfo(featuresFolder); 
      foreach (var f in featuresDir.GetFiles()) 
      { 
       string key = f.FullName; 
       string xml = System.IO.File.ReadAllText(key); 
       featuresFileInfo.Add(key, xml); 
      } 

      DirectoryInfo cfxDir = new DirectoryInfo(cfxFolder); 
      foreach (var f in cfxDir.GetFiles()) 
      { 
       string key = f.FullName; 
       string xml = System.IO.File.ReadAllText(key); 
       cfxFileInfo.Add(key, xml); 
      } 

      list.Add(featuresFileInfo); 
      list.Add(cfxFileInfo); 

      //after this any error happens we need to rollback all deleted files 
      rollbackFileDeleteNeeded = true; 

      //start deleting files 
      foreach(Dictionary<string, string> dict in list) 
      { 
       foreach (KeyValuePair<string, string> kvp in dict) 
       { 
        if (File.Exists(kvp.Key)) 
        { 
         //file exists to delete 
         File.Delete(kvp.Key); 
         //throw new Exception(); 
        } 
       } 
      } 
      Console.WriteLine("Success"); 
     } 
     catch(Exception ex) 
     { 
      if (rollbackFileDeleteNeeded == true) 
      { 
       foreach (Dictionary<string, string> dict in list) 
       { 
        foreach (KeyValuePair<string, string> kvp in dict) 
        { 
         if (File.Exists(kvp.Key) == false) 
         { 
          //file doesnot exists 
          System.IO.File.WriteAllText(kvp.Key, kvp.Value); 
         } 
        } 
       } 
      } 
      Console.WriteLine("Rolled back"); 
     }    
    } 
+3

我看不出有任何的問題在這裏...(BTW:*我怎麼能這樣做*是不是一個問題也) –

+0

@AaronHudon:請注意,關於組合一個DB操作和其他問題舉行會談*一個文件操作*就像一個事務。在一個事務中結合*多於一個文件操作*的問題在這裏沒有涉及,並且如果只有一個文件操作,則唯一的和被接受的答案是唯一有效的。 –

+1

我相信這是一個有效的問題。 –

回答

6

一個簡單的方法來「模擬」之類的事務行爲可能會創建兩個臨時的目錄,並從DIR1移動所有文件tempdir1和DIR2將所有文件tempdir2。 如果兩個都成功了,刪除你的tempdirs,如你所知,這些文件將不會被鎖定。

如果任何移動操作過程中出現任何異常,只是移動可以移動到目前爲止回以前這裏的一切。

在您操作結束刪除在任何情況下你都tempdirs。

按照要求,這裏有點碼 - 對不起,我沒有任何的Visual Studio在眼前,我無法測試和代碼它到底,我只是嘗試你指出正確的方向。

string tempdir1 = Environment.GetSpecialFolder.Temp + "\\tempdir1"; 
string tempdir2 = Environment.GetSpecialFolder.Temp + "\\tempdir2"; 
Directory.CreateDirectory(tempdir1); 
Directory.CreateDirectory(tempdir2); 

try 
{ 
    foreach (string filename in Directory.GetFiles(yourdir1, "*.*")) 
    { 
     File.Move(filename, tempdir1 + Path.GetFilename(filename)); 
    } 
    foreach (string filename in Directory.GetFiles(yourdir2, "*.*")) 
    { 
     File.Move(filename, tempdir2 + Path.GetFilename(filename)); 
    } 
} 
catch (Exception ex) 
{ 
    // Do the same foreach loops again, but from tempdir to yourdir 
    // to move everything back 
} 
finally 
{ 
    Directory.DeleteDirectory(tempdir1);  
    Directory.DeleteDirectory(tempdir2); 
} 
+1

@ L.B:爲什麼不應該顯示任何代碼的問題,也不會詢問代碼中的特定問題,而是用代碼來回答? –

+0

@grisgram更好的編碼連接目錄和文件名使用助手(.net文件和目錄靜態類)。除了那個好方向 –

+0

@LuisFilipe嗯..我使用靜態類 - 你的評論告訴我什麼? – Grisgram

相關問題