删除所有没有特定扩展名文件的文件夹和子目录
Delete all folders and subdirectories that doesn't have a file of certain extension
我正在使用此解决方案删除特定路径中的所有空文件夹和子目录:
static void Main(string[] args)
{
processDirectory(@"c:\temp");
}
private static void processDirectory(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
processDirectory(directory);
if (Directory.GetFiles(directory).Length == 0 &&
Directory.GetDirectories(directory).Length == 0)
{
Directory.Delete(directory, false);
}
}
}
效果很好。但我想删除所有空文件夹以及非空但不包含扩展名为 .dvr
的文件的文件夹。
例如,我的文件夹有文件:
a.log
b.log
c.dvr
d.dat
因此无法删除此文件夹,因为它包含一个扩展名为 dvr 的文件。
如何过滤? (我使用的是 GTK#,但我相信 C# 代码可以工作,因为这个解决方案是 C# 代码)
我会使用 Directory.EnumerateFiles 来查看目录是否包含您要查找的文件。将您的代码更改为:
static void Main(string[] args)
{
processDirectory(@"c:\temp");
}
private static void processDirectory(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
processDirectory(directory);
if (Directory.GetDirectories(directory).Length == 0 ||
Directory.EnumerateFiles(directory, "*.dvr").Length == 0
)
{
Directory.Delete(directory, false);
}
}
}
不幸的是,错误处理在 IO 操作中是非常基于异常的。如果目录不为空,Directory.Delete 将抛出 IOException。所以你必须手动删除文件:
private static bool processDirectory(string startLocation)
{
bool result = true;
foreach (var directory in Directory.GetDirectories(startLocation))
{
bool directoryResult = processDirectory(directory);
result &= directoryResult;
if (Directory.GetFiles(directory, "*.dvr").Any())
{
result = false;
continue;
}
foreach(var file in Directory.GetFiles(directory))
{
try
{
File.Delete(file);
}
catch(IOException)
{
// error handling
result = directoryResult = false;
}
}
if (!directoryResult) continue;
try
{
Directory.Delete(directory, false);
}
catch(IOException)
{
// error handling
result = false;
}
}
return result;
}
是正确的,但由于您需要它在 .NET 2.0 中工作,因此您不能使用 EnumerateFiles
方法,但是 GetFiles
可以很好地完成工作。但是需要更多的代码。
示例:
static void Main(string[] args)
{
processDirectory(@"c:\temp");
}
private static void processDirectory(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
processDirectory(directory);
if (Directory.GetDirectories(directory).Length == 0))
{
bool delete = false;
var files = Directory.GetFiles(directory);
// This will delete the directory if it contains a file with the Extension
// of .dvr, regardless if there are other files in there. Might be something you want to change.
for (int i = 0; i < files.Length && !delete; i++)
{
delete = files[i].Extension.Equals(".dvr", StringComparison.OrdinalIgnoreCase);
}
if (delete)
{
// Recursive must be set to true in order to
// delete files and sub-directories in the folder.
// This folder will not have any sub-directories
// so it's only used to delete the files.
Directory.Delete(directory, /*recursive*/ true);
}
}
}
}
本着减少代码的精神,您可以在 for
循环中移动 Directory.Delete
方法调用,如果需要,然后中断循环。
我正在使用此解决方案删除特定路径中的所有空文件夹和子目录:
static void Main(string[] args)
{
processDirectory(@"c:\temp");
}
private static void processDirectory(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
processDirectory(directory);
if (Directory.GetFiles(directory).Length == 0 &&
Directory.GetDirectories(directory).Length == 0)
{
Directory.Delete(directory, false);
}
}
}
效果很好。但我想删除所有空文件夹以及非空但不包含扩展名为 .dvr
的文件的文件夹。
例如,我的文件夹有文件:
a.log
b.log
c.dvr
d.dat
因此无法删除此文件夹,因为它包含一个扩展名为 dvr 的文件。
如何过滤? (我使用的是 GTK#,但我相信 C# 代码可以工作,因为这个解决方案是 C# 代码)
我会使用 Directory.EnumerateFiles 来查看目录是否包含您要查找的文件。将您的代码更改为:
static void Main(string[] args)
{
processDirectory(@"c:\temp");
}
private static void processDirectory(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
processDirectory(directory);
if (Directory.GetDirectories(directory).Length == 0 ||
Directory.EnumerateFiles(directory, "*.dvr").Length == 0
)
{
Directory.Delete(directory, false);
}
}
}
不幸的是,错误处理在 IO 操作中是非常基于异常的。如果目录不为空,Directory.Delete 将抛出 IOException。所以你必须手动删除文件:
private static bool processDirectory(string startLocation)
{
bool result = true;
foreach (var directory in Directory.GetDirectories(startLocation))
{
bool directoryResult = processDirectory(directory);
result &= directoryResult;
if (Directory.GetFiles(directory, "*.dvr").Any())
{
result = false;
continue;
}
foreach(var file in Directory.GetFiles(directory))
{
try
{
File.Delete(file);
}
catch(IOException)
{
// error handling
result = directoryResult = false;
}
}
if (!directoryResult) continue;
try
{
Directory.Delete(directory, false);
}
catch(IOException)
{
// error handling
result = false;
}
}
return result;
}
EnumerateFiles
方法,但是 GetFiles
可以很好地完成工作。但是需要更多的代码。
示例:
static void Main(string[] args)
{
processDirectory(@"c:\temp");
}
private static void processDirectory(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
processDirectory(directory);
if (Directory.GetDirectories(directory).Length == 0))
{
bool delete = false;
var files = Directory.GetFiles(directory);
// This will delete the directory if it contains a file with the Extension
// of .dvr, regardless if there are other files in there. Might be something you want to change.
for (int i = 0; i < files.Length && !delete; i++)
{
delete = files[i].Extension.Equals(".dvr", StringComparison.OrdinalIgnoreCase);
}
if (delete)
{
// Recursive must be set to true in order to
// delete files and sub-directories in the folder.
// This folder will not have any sub-directories
// so it's only used to delete the files.
Directory.Delete(directory, /*recursive*/ true);
}
}
}
}
本着减少代码的精神,您可以在 for
循环中移动 Directory.Delete
方法调用,如果需要,然后中断循环。