使用PHP从文件夹中删除所有文件?

Posted

技术标签:

【中文标题】使用PHP从文件夹中删除所有文件?【英文标题】:Deleting all files from a folder using PHP? 【发布时间】:2011-06-03 09:52:06 【问题描述】:

例如,我有一个名为“Temp”的文件夹,我想使用 php 从该文件夹中删除或刷新所有文件。我可以这样做吗?

【问题讨论】:

幸好这个问题在被标记为重复之前在下面得到了回答。下面的答案比链接的回答问题要好得多。加上问题不同,这个问题要求清空目录,而不是删除。 是的,这是一个不同的问题,得出了不同的答案。它不应被标记为重复。 【参考方案1】:
$files = glob('path/to/temp/*'); // get all file names
foreach($files as $file) // iterate files
  if(is_file($file)) 
    unlink($file); // delete file
  

如果你想删除像 .htaccess 这样的“隐藏”文件,你必须使用

$files = glob('path/to/temp/,.*', GLOB_BRACE);

【讨论】:

还有DirectoryIterator或者DirectoryRecursiveIterator。 虽然很明显,但我要提一下,例如,'path/to/temp/*.txt' 将仅删除 txt 文件等。 这也适用于相对路径吗?所以假设完整路径是“/var/www/html/folder_and_files_to_delete/”,删除脚本放在“/var/www/html/delete_folders_and_files.php”中。我可以将“folder_and_files_to_delete”作为路径吗? @yoano 是的,只要相对路径正确。 如果目录中有几万或几十万个文件,glob可以使用吗?【参考方案2】:

如果您想从文件夹(包括子文件夹)中删除所有内容,请使用 array_mapunlinkglob 的组合:

array_map( 'unlink', array_filter((array) glob("path/to/temp/*") ) );

此调用还可以处理空目录(感谢@mojuba 的提示!)

【讨论】:

最佳答案,谢谢。为了避免通知,我也会使用glob("...") ?: [](PHP 5.4+),因为对于空目录glob() 返回false 它会删除当前文件夹中的所有文件,但它会返回子文件夹的警告并且不会删除它们。 结合 Stichoza 和 mojuba 的答案:array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) ); @Ewout :即使我们将 Stichoza 和 Moujuba 的答案结合起来,因为您的 give 会为子文件夹返回相同的警告,并且不会删除它们 很遗憾,这不会删除子文件夹。【参考方案3】:

这是使用Standard PHP Library (SPL) 的更现代的方法。

$dir = "path/to/directory";
if(file_exists($dir))
    $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
    $ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
    foreach ( $ri as $file ) 
        $file->isDir() ?  rmdir($file) : unlink($file);
    

【讨论】:

这很好用,当您没有 SSH 访问权限并且 FTP 需要 小时 递归删除大量文件和文件夹时...用这些行我在更少的时间内删除了 35000 个文件超过 3 秒! 对于 PHP 7.1 用户:必须使用 $file->getRealPath() 而不是 $file。否则,PHP 会给你一个错误,说 unlink 需要一个路径,而不是 SplFileInfo 的实例。 这个解决方案正在崩溃服务器 - 本地主机和在线服务器。对我来说不是很好的解决方案。谢谢。【参考方案4】:
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) 
    if(!$fileInfo->isDot()) 
        unlink($fileInfo->getPathname());
    

【讨论】:

应该是 unlink('/path/to/directory/'.$fileInfo->getFilename());因为 unlink 需要路径。不过答案很好。 你甚至可以做 unlink($fileInfo->getPathname());这将为您提供文件的完整路径。 php.net/manual/en/directoryiterator.getpathname.php 'DirectoryIterator' 不也遍历子目录吗?如果是这样,“取消链接”会在这种情况下产生警告。循环的主体不应该更像 Yamiko 的答案,而是在调用“取消链接”之前检查每个条目是否是文件?【参考方案5】:

此代码来自http://php.net/unlink:

/**
 * Delete a file or recursively delete a directory
 *
 * @param string $str Path to file or directory
 */
function recursiveDelete($str) 
    if (is_file($str)) 
        return @unlink($str);
    
    elseif (is_dir($str)) 
        $scan = glob(rtrim($str,'/').'/*');
        foreach($scan as $index=>$path) 
            recursiveDelete($path);
        
        return @rmdir($str);
    

【讨论】:

【参考方案6】:
$dir = 'your/directory/';
foreach(glob($dir.'*.*') as $v)
    unlink($v);

【讨论】:

【参考方案7】:

假设您有一个包含大量文件的文件夹,将它们全部读取,然后分两步删除,这并不是那么执行。 我相信删除文件最有效的方法就是使用系统命令。

例如在 linux 上我使用:

exec('rm -f '. $absolutePathToFolder .'*');

或者如果你想要递归删除而不需要编写递归函数

exec('rm -f -r '. $absolutePathToFolder .'*');

对于 PHP 支持的任何操作系统都存在相同的确切命令。 请记住,这是删除文件的一种执行方式。在运行此代码之前,必须检查并保护 $absolutePathToFolder,并且必须授予权限。

【讨论】:

如果$absolutePatToFolder 为空,则使用此方法有点不安全 @LawrenceCherone 其他替代方案是否更安全? @LawrenceCherone 我希望现在没有人以 root 权限运行 php。说真的,我希望输入是“安全的”,就像上述所有功能一样。 投票最多的解决方案不适用于 www 或 www-data 不是所有者的开发环境。由服务器管理员来确保设置文件夹的正确权限。 exec 是完成工作的宝贵工具,并且具有强大的功能等。***.com/a/2765171/418974 可能想使用 /* 以确保 :-)【参考方案8】:

参见readdir 和unlink。

<?php
    if ($handle = opendir('/path/to/files'))
    
        echo "Directory handle: $handle\n";
        echo "Files:\n";

        while (false !== ($file = readdir($handle)))
        
            if( is_file($file) )
            
                unlink($file);
            
        
        closedir($handle);
    
?>

【讨论】:

【参考方案9】:

在 PHP 中从文件夹中删除所有文件的简单且最佳的方法

$files = glob('my_folder/*'); //get all file names
foreach($files as $file)
    if(is_file($file))
    unlink($file); //delete file

从这里得到这个源代码 - http://www.codexworld.com/delete-all-files-from-folder-using-php/

【讨论】:

【参考方案10】:

unlinkr 函数通过确保它不会删除脚本本身来递归地删除给定路径中的所有文件夹和文件。

function unlinkr($dir, $pattern = "*") 
    // find all files and folders matching pattern
    $files = glob($dir . "/$pattern"); 

    //interate thorugh the files and folders
    foreach($files as $file) 
    //if it is a directory then re-call unlinkr function to delete files inside this directory     
        if (is_dir($file) and !in_array($file, array('..', '.')))  
            echo "<p>opening directory $file </p>";
            unlinkr($file, $pattern);
            //remove the directory itself
            echo "<p> deleting directory $file </p>";
            rmdir($file);
         else if(is_file($file) and ($file != __FILE__)) 
            // make sure you don't delete the current script
            echo "<p>deleting file $file </p>";
            unlink($file); 
        
    

如果要删除放置此脚本的所有文件和文件夹,请按以下方式调用它

//get current working directory
$dir = getcwd();
unlinkr($dir);

如果您只想删除 php 文件,请按以下方式调用它

unlinkr($dir, "*.php");

您也可以使用任何其他路径来删除文件

unlinkr("/home/user/temp");

这将删除 home/user/temp 目录中的所有文件。

【讨论】:

老歌但好人!在课堂上用作示例,它很受欢迎!【参考方案11】:

另一种解决方案: 该类删除所有文件、子目录和子目录下的文件。

class Your_Class_Name 
    /**
     * @see http://php.net/manual/de/function.array-map.php
     * @see http://www.php.net/manual/en/function.rmdir.php 
     * @see http://www.php.net/manual/en/function.glob.php
     * @see http://php.net/manual/de/function.unlink.php
     * @param string $path
     */
    public function delete($path) 
        if (is_dir($path)) 
            array_map(function($value) 
                $this->delete($value);
                rmdir($value);
            ,glob($path . '/*', GLOB_ONLYDIR));
            array_map('unlink', glob($path."/*"));
        
    

【讨论】:

【参考方案12】:

发布了一个通用的文件和文件夹处理类,用于复制、移动、删除、计算大小等,可以处理单个文件或一组文件夹。

https://gist.github.com/4689551

使用方法:

复制(或移动)单个文件或一组文件夹/文件:

$files = new Files();
$results = $files->copyOrMove('source/folder/optional-file', 'target/path', 'target-file-name-for-single-file.only', 'copy');

删除单个文件或路径中的所有文件和文件夹:

$files = new Files();
$results = $files->delete('source/folder/optional-file.name');

计算单个文件或一组文件夹中的一组文件的大小:

$files = new Files();
$results = $files->calculateSize('source/folder/optional-file.name');

【讨论】:

【参考方案13】:
 <?
//delete all files from folder  & sub folders
function listFolderFiles($dir)

    $ffs = scandir($dir);
    echo '<ol>';
    foreach ($ffs as $ff) 
        if ($ff != '.' && $ff != '..') 
            if (file_exists("$dir/$ff")) 
                unlink("$dir/$ff");
            
            echo '<li>' . $ff;
            if (is_dir($dir . '/' . $ff)) 
                listFolderFiles($dir . '/' . $ff);
            
            echo '</li>';
        
    
    echo '</ol>';

$arr = array(
    "folder1",
    "folder2"
);
for ($x = 0; $x < count($arr); $x++) 
    $mm = $arr[$x];
    listFolderFiles($mm);

//end
?> 

【讨论】:

【参考方案14】:

对我来说,readdir 的解决方案是最好的,而且效果很好。对于 glob,该函数在某些情况下会失败。

// Remove a directory recursively
function removeDirectory($dirPath) 
    if (! is_dir($dirPath)) 
        return false;
    

    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') 
        $dirPath .= '/';
    

    if ($handle = opendir($dirPath)) 

        while (false !== ($sub = readdir($handle))) 
            if ($sub != "." && $sub != ".." && $sub != "Thumb.db") 
                $file = $dirPath . $sub;

                if (is_dir($file)) 
                    removeDirectory($file);
                 else 
                    unlink($file);
                
            
        

        closedir($handle);
    

    rmdir($dirPath);

【讨论】:

【参考方案15】:
public static function recursiveDelete($dir)

    foreach (new \DirectoryIterator($dir) as $fileInfo) 
        if (!$fileInfo->isDot()) 
            if ($fileInfo->isDir()) 
                recursiveDelete($fileInfo->getPathname());
             else 
                unlink($fileInfo->getPathname());
            
        
    
    rmdir($dir);

【讨论】:

【参考方案16】:

我已经构建了一个非常简单的包,名为“Pusheh”。使用它,您可以清除目录或完全删除目录(Github link)。它也可以在Packagist 上找到。

例如,如果你想清除Temp目录,你可以这样做:

Pusheh::clearDir("Temp");

// Or you can remove the directory completely
Pusheh::removeDirRecursively("Temp");

如果您有兴趣,请参阅the wiki。

【讨论】:

【参考方案17】:

我更新了@Stichoza 的答案以通过子文件夹删除文件。

function glob_recursive($pattern, $flags = 0) 
    $fileList = glob($pattern, $flags);
    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) 
        $subPattern = $dir.'/'.basename($pattern);
        $subFileList = glob_recursive($subPattern, $flags);
        $fileList = array_merge($fileList, $subFileList);
    
    return $fileList;


function glob_recursive_unlink($pattern, $flags = 0) 
    array_map('unlink', glob_recursive($pattern, $flags));

【讨论】:

【参考方案18】:

这是一个简单的方法和很好的解决方案。试试这个代码。

array_map('unlink', array_filter((array) array_merge(glob("folder_name/*"))));

【讨论】:

以上是关于使用PHP从文件夹中删除所有文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用htaccess从URL中删除公用文件夹

从 php 循环中删除项目

如何使用 PHP Composer 从 Laravel 中删除一个包?

使用PHP删除文件夹中的所有文件?

如何从文件的开头删除?

如何使用 PHP 删除所有 xml 属性值?