[英]C# : Delete all files or none from two different directories
對不起,如果重復的話。 請指出正確的方向。 我有2個目錄Dir1和Dir2。 我在Dir1中有一個文件,在Dir2中有2個文件。
Dir1
-Dir1File1.txt
Dir2
-Dir2File1.txt
-Dir2File2.txt
現在,我需要刪除Dir1和Dir2中的所有文件。 我需要刪除所有文件或不刪除任何文件,即,如果我成功刪除了Dir1中的文件,並且當我嘗試刪除Dir2中的文件並且發生錯誤時,則必須回滾Dir1中的刪除。
解
我所做的不是創建和刪除臨時文件夾。 我使用字典來跟蹤我要刪除的文件全名和數據。
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");
}
}
一種簡單的“模擬”事務行為的簡單方法是創建兩個臨時目錄,然后將所有文件從dir1移動到tempdir1,並將所有文件從dir2移動到tempdir2。 如果兩者都成功,請刪除您的臨時目錄,如您所知,文件將沒有鎖定。
如果在任何移動操作期間發生任何異常,只需將可以移動的所有內容移回原處即可。
在操作結束時,請在所有情況下都刪除兩個臨時目錄。
根據要求,在此處添加了一些代碼-對不起,我手頭沒有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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.