这个问题可能看起来有点荒谬,但这里有......
我有一个目录结构:它有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];
}
有没有更好的方法来实现我想要的目标?
答案 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”功能将独立完成..