2016-11-08 13 views
0

重複していると申し訳ありません。正しい方向に私を指差してください。私は2つのディレクトリDir1とDir2を持っています。 Dir1に1つのファイルがあり、Dir2に2つのファイルがあります。C#:2つの異なるディレクトリからすべてのファイルを削除するか、全く削除しない

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

私は(ところで:*どのように私は*また、問題ではないことを行うことができます)...ここか質問が表示されていない –

+0

@AaronHudon注:1 DB操作を組み合わせることについて、他の質問会談いると* 1つのファイル操作*はトランザクションのようなものです。トランザクション内で*複数のファイル操作*を結合する問題は、そこには触れられず、唯一の受け入れられた答えは、ファイル操作が1つだけである場合にのみ、排他的に有効です。 –

+1

これは有効な質問だと思います。 –

答えて

6

2一時、ディレクトリを作成し、tempdir1とtempdir2にDIR2からすべてのファイルを移動するためにDIR1からすべてのファイルを移動することができトランザクション動作の種類を「シミュレート」するための簡単な方法。 両方がうまくいくなら、あなたのtempdirを削除してください。分かっているように、ファイルはロックされません。

移動操作中に例外が発生した場合は、今まで移動できたすべてのものを元の場所に戻してください。

操作の終了時に、いずれの場合も、すべてのtempdirを削除します。

ここにビットコードがあります。申し訳ありませんが、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 hmmm ..私は静的なクラスを使用しています - あなたのコメントは私に何を教えてくれるのですか? – Grisgram

関連する問題