问题背景
我有一个多媒体网络应用程序,用户可以在其中保存和删除文件。保存的文件用于各种应用程序范围的功能。
保存文件时,它们会被放在目录树的深处(通常是6到9个文件夹深)。 这些文件处于如此深层次,以确保管理员/超级用户可以轻松区分文件结构和以与现有的手动系统相匹配。
例如,
" UploadedAssets"是根目录,可以包含以下文件夹结构:
\ \\\ sp \ cookery \ ckpe \ interactives \ timestep \ blahblah \ item1 \ image01.png
\\\ sp \ cookery \ ckpe \ interactives \ timestep \ blah_only \ item1 \ image02.png
\\\ sp \ cookery \ ckpe \ interactives \ timestep \ blah_only \ item2 \ image03.png
\\ \ sp \ cookery \ abcd \ interactives \ timestep \ blahblah \ item1 \ image66.png
由于可能的目录名选项的数量,即使在测试阶段,根" UploadedAssets"目录已经爆炸,并且有大量空的未使用的目录和枯枝。
我的问题是
用户从目录中删除一个/多个文件后(例如 image01.png 来自 item1 ),
E.g。在上面给出的示例目录结构中,
如果用户删除 image01.png ,则应删除 item1 和 blahblah 目录
如果用户删除 image02.png ,则应仅删除其父 item1 目录
如果用户删除 image66.png ,则应删除所有父目录,包括 abcd
我的尝试/研究
我知道如何使用php rmdir删除单个目录。但我无法思考如何以递归方式使用它来解决我的问题。
我试图了解以下内容,但我不知道其中任何一个是否适合我的问题 PHP: Unlink All Files Within A Directory, and then Deleting That Directory
答案 0 :(得分:0)
因为这有一些开销,所以我建议你只在绝对需要的时候用PHP做这件事。您可以使用Linux find
命令:
find /path/to/dir -empty -type d -delete
我会把它放在一个cron工作中。如果您愿意,可以使用php system command来执行此操作:
system('find /path/to/dir -empty -type d -delete', $retval);
使用它你只需要删除文件,然后让它每天运行一次,以便完成并处理任何空目录。这可能看起来比在PHP中使用它更加骇人,但它运行得更快。它不太便携,但对于大多数网站来说这不应该太重要。将其保存为rdel.bat
(我确保您已启用[Show hidden file extensions][2]
资源管理器文件夹选项,但如果不这样做,请使用文本编辑器Save As...
对话框中的下拉菜单以确保它有适当的扩展名。)
<强>更新强>
要在Windows中执行相同的操作,请使用仅包含以下一行的批处理文件:
for /f "delims=" %%d in ('dir /s /b /ad ^| sort /r') do rd "%%d"
通过更改目录并运行新文件来测试它。它应该删除当前的任何空目录。
仅安排add an entry to your task scheduler。根据您使用的Windows版本,这有一点不同。确保正确设置工作目录(批处理文件知道从哪里开始)。
这个问题是在Windows中很多垃圾文件都是在空目录(即Thumbs.db)中创建的。您可以通过向批处理文件添加代码来删除任何这些文件来处理:
del /s /q Thumbs.db
将其添加到另一行上方并重复其他任何可能不需要的行。