regex — PHP удалить все файлы из каталога — исключить расширение файла

Я пытаюсь на всю жизнь найти лучший способ удалить все файлы в одном каталоге, исключая одно расширение файла, т.е. все, что не .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 файл.

Любая помощь / совет приветствуется.

0

Решение

Это должно работать для вас:

(Я просто использую array_diff() чтобы получить все файлы, которые отличаются от *.zip а потом я иду через эти файлы и отсоединяю их)

<?php

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

?>
3

Другие решения

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

Этот код работает с массивом исключенных расширений, он загружает все файлы в каталоге, а затем проверяет расширение каждого файла. Если расширение находится в списке исключений, оно не будет удалено. Иначе, это так.

4

Как насчет вызова в оболочку? Итак, в Linux:

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

Я просто хотел бы знать самый простой / эффективный способ удалить все файлы в одном каталоге, которые не являются .zip-файлами.

SPL Iterators очень эффективны и действенны.

Вот что я бы использовал:

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

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

Вы пробовали это:

$path = "dir/";
$dir = dir($path);
while ($file = $dir->read()) {
if ($file != "." && $file != ".." && substr($file, -4) !== '.zip') {
unlink($file);
}
}
0
По вопросам рекламы [email protected]