C#:从两个不同的目录中删除所有文件或不删除

时间:2016-11-08 23:00:10

标签: c# file

如果重复,我很抱歉。请指出我正确的方向。我有2个目录Dir1和Dir2。我在Dir1中有一个文件,在Dir2中有两个文件。

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");
        }            
    }

1 个答案:

答案 0 :(得分:6)

“模拟”某种事务行为的简单方法可能是创建两个临时目录并将所有文件从dir1移动到tempdir1,并将所有文件从dir2移动到tempdir2。 如果两者都成功,删除你的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);
}