PHP从目录中删除所有文件 - 排除文件扩展名

时间:2015-01-26 19:12:14

标签: php regex preg-match glob

我正在努力为我的生活找到删除单个目录中所有文件的最佳方法,不包括单个文件扩展名,即任何不是.zip的文件

到目前为止我使用的当前方法成功删除了所有文件:

$files = glob('./output/*');
foreach($files as $file)
{ 
    if(is_file($file))
    unlink($file); // delete file
}

我尝试过这样修改:

$files = glob('./output/**.{!zip}', GLOB_BRACE);
foreach($files as $file)
{
  if(is_file($file))
    unlink($file); // delete file
}

但是,我没有达到预期的效果。我已经改变了如下的行,它只删除了zip文件本身(所以我可以做到与想要的相反)。

$files = glob('./output/*.{zip}', GLOB_BRACE);

据我所知,还有其他方法可以读取目录内容并使用strpos / preg_match等进行相应删除。我还看到了许多其他方法,但这些方法似乎很长,或者用于递归目录循环。

我当然没有与glob()结婚,我只想知道删除单个目录中不是.zip文件的所有文件的最简单/最有效的方法。

感谢任何帮助/建议。

5 个答案:

答案 0 :(得分:4)

$exclude = array("zip");
$files = glob("output/*");
foreach($files as $file) {
    $extension = pathinfo($file, PATHINFO_EXTENSION);
    if(!in_array($extension, $exclude)) unlink($file);
}

此代码通过包含一系列排除的扩展来工作,它会加载目录中的所有文件,然后检查每个文件的扩展名。如果扩展名在排除列表中,则不会被删除。否则,确实如此。

答案 1 :(得分:3)

这应该适合你:

(我只是使用array_diff()来获取与*.zip不同的所有文件,然后我浏览这些文件并取消链接。

<?php

    $files = array_diff(glob("*.*"), glob("*.zip"));
    foreach($files as $file) {
      if(is_file($file))
        unlink($file); // delete file
    }

?>

答案 2 :(得分:1)

如何调用shell?所以在Linux中:

$path = '/path/to/dir/';
$shell_command = escapeshellcmd('find ' . $path .' ! -name "*.zip" -exec rm -r {}');
$output = shell_exec($shell_command);

答案 3 :(得分:1)

  

我只想知道删除单个目录中不是.zip文件的所有文件的最简单/最有效的方法。

SPL Iterators非常有效且高效。

这就是我要用的:

$folder = __DIR__;
$it = new FilesystemIterator($folder, FilesystemIterator::SKIP_DOTS);

foreach ($it as $file) {
    if ($file->getExtension() !== 'zip') {
        unlink($file->getFilename());
    }
}

答案 4 :(得分:0)

你试过这个:

$path = "dir/";
$dir = dir($path);
while ($file = $dir->read()) {
    if ($file != "." && $file != ".." && substr($file, -4) !== '.zip') {
    unlink($file);
    }
}