From 3f03cfa14d53c17f74802d17797c39d4e2cb2856 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Tue, 21 Aug 2012 10:42:01 +0200 Subject: [PATCH] RemoveEmptyDirectories() now ignores dot files --- HISTORY | 4 ++++ tools.c | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/HISTORY b/HISTORY index 759f400e..5e2ca522 100644 --- a/HISTORY +++ b/HISTORY @@ -7198,3 +7198,7 @@ Video Disk Recorder Revision History (thanks to Mehdi Karamnejad for reporting a problem with garbled UTF-8 EPG data and helping to debug it). - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). +- When checking whether a video directory is empty, file names that start with a + dot ('.') are now ignored and will be implicitly removed if the directory contains + no other files. This fixes the leftover ".sort" files that were introduced in + version 1.7.29. diff --git a/tools.c b/tools.c index bc01a5f0..3d9c513c 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 2.24 2012/05/12 13:29:20 kls Exp $ + * $Id: tools.c 2.25 2012/08/21 10:34:37 kls Exp $ */ #include "tools.h" @@ -435,6 +435,7 @@ bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks) bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis) { + bool HasDotFiles = false; cReadDir d(DirName); if (d.Ok()) { bool empty = true; @@ -448,6 +449,8 @@ bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis) if (!RemoveEmptyDirectories(buffer, true)) empty = false; } + else if (*e->d_name == '.') // "dot files" don't count + HasDotFiles = true; else empty = false; } @@ -458,6 +461,22 @@ bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis) } } if (RemoveThis && empty) { + if (HasDotFiles) { + cReadDir d(DirName); + if (d.Ok()) { + struct dirent *e; + while ((e = d.Next()) != NULL) { + if (*e->d_name == '.') { // for safety - should always be true + cString buffer = AddDirectory(DirName, e->d_name); + dsyslog("removing %s", *buffer); + if (remove(buffer) < 0) { + LOG_ERROR_STR(*buffer); + return false; + } + } + } + } + } dsyslog("removing %s", DirName); if (remove(DirName) < 0) { LOG_ERROR_STR(DirName);