PHP递归删除空父目录

时间:2014-03-20 04:48:55

标签: php recursion unlink rmdir

问题背景

我有一个多媒体网络应用程序,用户可以在其中保存和删除文件。保存的文件用于各种应用程序范围的功能。

保存文件时,它们会被放在目录树的深处(通常是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

  1. 前5个名称是用户可选择的(来自动态下拉菜单),每个名称约20-25个选项。
  2. 最后3个取决于用户输入的内容(例如类别,标题等)。这是从用户使用文本输入字段接收的。这些目录可以是1个或最多4个目录。
  3. 最后一个目录" item1"可以有一个或多个文件没有子目录
  4. 除最后一个目录(item1)之外的每个目录都可以有其他子目录
  5. 当我删除/删除文件时,显然程序知道文件位置的完整路径。
  6. 由于可能的目录名选项的数量,即使在测试阶段,根" UploadedAssets"目录已经爆炸,并且有大量空的未使用的目录和枯枝。


    我的问题是

    用户从目录中删除一个/多个文件后(例如 image01.png 来自 item1 ),

    1. 如何从已删除的文件中遍历向上树(仅限直接父项)并删除父节点(如果为空)。
    2. 删除其中一个directoy有其他子/文件,然后删除该目录并完成该过程。
    3. 在预定义的根目录中删除停止或
    4. 在升级 n 目录级别后停止
    5. 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

      Delete files then directory

      http://php.net/manual/en/function.glob.php

      https://stackoverflow.com/a/4490706/2337895

1 个答案:

答案 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

将其添加到另一行上方并重复其他任何可能不需要的行。