C# 如何删除内容为空的文件夹
这个问题可能看起来有点荒谬,但还是这样 我有一个目录结构:它有8个级别。例如,这是一条路径:C# 如何删除内容为空的文件夹,c#,io,directory,C#,Io,Directory,这个问题可能看起来有点荒谬,但还是这样 我有一个目录结构:它有8个级别。例如,这是一条路径: C:\Root\Catalogue\000EC902F17F\2\2013\11\15\13 “2”是网络摄像头的索引。我一共有4个。所以 C:\Root\Catalogue\000EC902F17F\1\2013\11\15\13 C:\Root\Catalogue\000EC902F17F\2\2013\11\15\13 C:\Root\Catalogue\000EC902F17F\3\2013\
C:\Root\Catalogue\000EC902F17F\2\2013\11\15\13
“2”是网络摄像头的索引。我一共有4个。所以
C:\Root\Catalogue\000EC902F17F\1\2013\11\15\13
C:\Root\Catalogue\000EC902F17F\2\2013\11\15\13
C:\Root\Catalogue\000EC902F17F\3\2013\11\15\13
C:\Root\Catalogue\000EC902F17F\4\2013\11\15\13
“000EC902F17F”是我自己的网络摄像头uuid
The '2013' is the year.
The '11' is the month.
The '13' is the day.
当我捕获运动时,JPEG被保存在一个目录中,表示该图像是何时被捕获的
我有一个定时器,它遍历每个目录,并从图像创建一个视频文件。然后删除图像
现在,我想有另一个计时器,它将通过每个目录检查空目录。如果它们为空,则删除文件夹
这个整理计时器将查看创建的目录,这些目录比它运行的当天要旧
我目前有:
private List<string> GetFoldersToDelete()
{
DateTime to_date = DateTime.Now.AddDays(-1);
List<string> paths = Directory.EnumerateDirectories(@"C:\MotionWise\Catalogue\" + Shared.ActiveMac, "*", SearchOption.AllDirectories)
.Where(path =>
{
DateTime lastWriteTime = File.GetLastWriteTime(path);
return lastWriteTime <= to_date;
})
.ToList();
return paths;
}
private List GetFoldersToDelete()
{
DateTime to_date=DateTime.Now.AddDays(-1);
列表路径=目录.EnumerateDirectory(@“C:\MotionWise\Catalog\”+Shared.ActiveMac,“*”,SearchOption.AllDirectory)
.Where(路径=>
{
DateTime lastWriteTime=File.GetLastWriteTime(路径);
return lastWriteTime下面是一段快速代码:
static void Main(string[] args)
{
var baseDirectory = ".";
DeleteEmptyDirectory(baseDirectory);
}
static bool DeleteEmptyDirectory(string directory)
{
var subDirs = Directory.GetDirectories(directory);
var canDelete = true;
if (subDirs.Any())
foreach (var dir in subDirs)
canDelete = DeleteEmptyDirectory(dir) && canDelete;
if (canDelete && !Directory.GetFiles(directory).Any())
{
Directory.Delete(directory);
return true;
}
else
return false;
}
这将删除所有空文件夹,并保留其中所有文件的所有内容
关于你对递归的评论……我不会担心,除非你有疯狂的符号链接来创建一个无限的目录结构。一个稍微不同的观点,作为比较:
public static void DeleteEmptyFolders(string rootFolder)
{
foreach (string subFolder in Directory.EnumerateDirectories(rootFolder))
DeleteEmptyFolders(subFolder);
DeleteFolderIfEmpty(rootFolder);
}
public static void DeleteFolderIfEmpty(string folder)
{
if (!Directory.EnumerateFileSystemEntries(folder).Any())
Directory.Delete(folder);
}
(我觉得这本书可读性稍高。)像这样的吗
private void KillFolders()
{
DateTime to_date = DateTime.Now.AddDays(-1);
List<string> paths = Directory.EnumerateDirectories(@"C:\MotionWise\Catalogue\" + Shared.ActiveMac, "*", SearchOption.TopDirectoryOnly)
.Where(path =>
{
DateTime lastWriteTime = File.GetLastWriteTime(path);
return lastWriteTime <= to_date;
})
.ToList();
foreach (var path in paths))
{
cleanDirs(path);
}
}
private static void cleanDirs(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
cleanDirs(directory);
if (Directory.GetFiles(directory).Length == 0 && Directory.GetDirectories(directory).Length == 0)
{
Directory.Delete(directory, false);
}
}
}
private void KillFolders()
{
DateTime to_date=DateTime.Now.AddDays(-1);
列表路径=目录。枚举目录(@“C:\MotionWise\Catalog\”+Shared.ActiveMac,“*”,SearchOption.TopDirectoryOnly)
.Where(路径=>
{
DateTime lastWriteTime=File.GetLastWriteTime(路径);
return lastWriteTime我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”.Hi John,谢谢你的链接。我现在将阅读它。我将在回答一个类似问题后建立一个解决方案模型:递归执行的目的是,如果删除一个空文件夹,父文件夹现在可能是空的,可以删除。有时我会担心使用递归。一个只有8层的目录结构els deep不是其中之一。如果操作正确,可能会出现这种情况。我会担心,当其中一个子目录中确实包含文件时,我可能会尝试删除一个有子目录但没有文件的目录。这就是为什么我喜欢递归方式。我知道删除每个目录时都是空的。这样代码就不那么复杂了。您的答案消失了。很高兴这样做回过头来看:)@AndrewSimpson我在检查它是否有效时暂时删除了它。:)对不起,我以为我已经“勾选”了这个
private void KillFolders()
{
DateTime to_date = DateTime.Now.AddDays(-1);
List<string> paths = Directory.EnumerateDirectories(@"C:\MotionWise\Catalogue\" + Shared.ActiveMac, "*", SearchOption.TopDirectoryOnly)
.Where(path =>
{
DateTime lastWriteTime = File.GetLastWriteTime(path);
return lastWriteTime <= to_date;
})
.ToList();
foreach (var path in paths))
{
cleanDirs(path);
}
}
private static void cleanDirs(string startLocation)
{
foreach (var directory in Directory.GetDirectories(startLocation))
{
cleanDirs(directory);
if (Directory.GetFiles(directory).Length == 0 && Directory.GetDirectories(directory).Length == 0)
{
Directory.Delete(directory, false);
}
}
}