C# 如何删除内容为空的文件夹

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\

这个问题可能看起来有点荒谬,但还是这样

我有一个目录结构:它有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\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);
        }
    }
}