压缩和下载目录后递归删除目录失败

Posted

技术标签:

【中文标题】压缩和下载目录后递归删除目录失败【英文标题】:Recursively deleting a directory fails after zipping and downloading its contents 【发布时间】:2014-04-14 20:58:27 【问题描述】:

我跟着this SO thread 递归删除了一个目录(见下面的代码)。问题是在压缩目录内容并下载 zip 文件后,我无法让这些命令执行它们的操作。

文件/文件夹权限似乎不是问题,因为正如我所说,如果不涉及文件夹压缩,代码就可以正常工作。

有人有什么想法吗?

$this->zip->download($file_name); //a Codeigniter function, though think it could be any function that executes the zip file download.

$dir='uploads/folder1'; 
//the contents of folder1 are "foo1.png" and "foo2.png"

$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),  RecursiveIteratorIterator::CHILD_FIRST);

foreach ($files as $fileinfo) 
    $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
    $todo($fileinfo->getRealPath());


rmdir($dir); 

【问题讨论】:

似乎 php 和您的服务器目录捆绑在一起,在 zip 之后它说嘿我还没完成,这些目录/文件不是免费的......(不确定罪魁祸首)但是,当您复制到临时目录,压缩文件夹和文件,然后删除原始目录时会发生什么?只是好奇。 嗨@FrankTudor 谢谢,我每次都在创建一个新目录。 只是好奇..你是在 windows 还是 linux 上? 好的,您尝试过 zip close() php.net/manual/en/function.zip-close.php 看起来它会锁定您的文件和目录,直到您明确调用 close。如果您已经尝试过,我们深表歉意。 您可能需要稍微重构一下代码...看看这个 SO 编码器是如何设置它的...更详细但明确...***.com/questions/4914750/… 【参考方案1】:

我遇到了同样的问题并找到了解决方案。

protected function _deleteFolder($path = null) 

    if (!$path || !file_exists($path)) 
        return FALSE;
    

    delete_files($path, true); // delete all files/folders
    rmdir($path);


$folder_path = '/path/to/the/folder/to/be/zipped/downloaded';
$this->zip->read_dir($folder_path, FALSE);
$this->_deleteFolder($folder_path); // This will delete the folder
$this->zip->download('zipped-downloadable-file-name.zip');

这对我有用。

【讨论】:

【参考方案2】:

要递归删除目录,您可以使用此代码。 注意: $var 可以是文件或目录。如果是目录,则删除所有内容和目录。 来源:http://php.net/manual/en/function.rmdir.php,请看 jurchiks101 在 gmail dot com 的评论。

if(file_exists($var))

    if (PHP_OS === 'Windows')
    
        exec("rd /s /q $var");
    
    else
    
        exec("rm -rf $var");
    

【讨论】:

以上是关于压缩和下载目录后递归删除目录失败的主要内容,如果未能解决你的问题,请参考以下文章

Java递归删除目录及目录下的文件

Java递归删除目录及目录下的文件

[Linux] 删除文件夹和文件的命令

Linux递归解压缩一个目录下的全部文件

压缩文件2 tar 打包压缩

Linux命令(十八) 压缩或解压缩文件和目录 gzip gunzip