C#:从两个不同的目录中删除所有文件或不删除
如果重复,我很抱歉。请指向正确的方向。我有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");
}
}
一个简单的方法来“模拟”之类的事务行为可能会创建两个临时的目录,并从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);
}
@ L.B:为什么不应该显示任何代码的问题,也不会询问代码中的特定问题,而是用代码来回答? –
@grisgram更好的编码连接目录和文件名使用助手(.net文件和目录静态类)。除了那个好方向 –
@LuisFilipe嗯..我使用静态类 - 你的评论告诉我什么? – Grisgram
我看不出有任何的问题在这里...(BTW:*我怎么能这样做*是不是一个问题也) –
@AaronHudon:请注意,关于组合一个DB操作和其他问题举行会谈*一个文件操作*就像一个事务。在一个事务中结合*多于一个文件操作*的问题在这里没有涉及,并且如果只有一个文件操作,则唯一的和被接受的答案是唯一有效的。 –
我相信这是一个有效的问题。 –