簡體   English   中英

C#:從兩個不同的目錄中刪除所有文件或不刪除任何文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM