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

时间:2013-11-15 14:24:57

标签: 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\11\15\13
C:\Root\Catalogue\000EC902F17F\4\2013\11\15\13

'000EC902F17F'是我自己的网络摄像头。

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

呼叫:

        List<string> _deleteMe = new List<string>();
        List<string> _folders2Delete = GetFoldersToDelete();
        foreach (string _folder in _folders2Delete)
        {
           List<string> _folderContents = Directory.EnumerateFiles(_folder).ToList();
           if (_folderContents.Count == 0)
           {
               _folders2Delete.Add(_folder);
           }
        }
        for (int _index = 0; _index < _folders2Delete.Count; _index++)
        {
            Directory.Delete(_folders2Delete[_index];
        }

有没有更好的方法来实现我想要的目标?

3 个答案:

答案 0 :(得分:1)

这是一段快速的代码:

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

这将删除所有空文件夹,并保留包含其中任何文件的任何内容。

关于你对递归的评论...我不担心它,除非你有疯狂的符号链接创建一个无限的目录结构。 ;)

答案 1 :(得分:1)

略有不同,为了比较:

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

(我发现这稍微更具可读性。)

答案 2 :(得分:1)

这样的东西?

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

请注意;这不会考虑最后的writeTime。它将从topDir获取,其中您拥有日期早于一天的所有差异文件夹并清理空的子目录。

如果您的目标是简单地清理目标Dir中的空文件夹,那么“cleanDirs”功能将独立完成..