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

0

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

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

Теги:
glob
preg-match

5 ответов

3
Лучший ответ

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

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

<?php

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

?>
  • 0
    Большое спасибо, это кажется самым простым решением для моих проблем
  • 0
    @TheHumbleRat Добро пожаловать! Хорошего дня: D
4
$exclude = array("zip");
$files = glob("output/*");
foreach($files as $file) {
    $extension = pathinfo($file, PATHINFO_EXTENSION);
    if(!in_array($extension, $exclude)) unlink($file);
}

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

  • 0
    Я должен буду сохранить это для дальнейшего использования. Большое спасибо за вклад, и я понимаю / ценю использование PATHINFO_EXTENSION
1

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

Итераторы SPL очень эффективны и эффективны.

Это то, что я буду использовать:

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

foreach ($it as $file) {
    if ($file->getExtension() !== 'zip') {
        unlink($file->getFilename());
    }
}
  • 1
    Я видел что-то об этом при поиске, но я не использовал их раньше. Мне нужно будет записать это и дать ему тест, большое спасибо за совет
  • 0
    Добро пожаловать. Библиотека SPL плохо документирована в руководстве по PHP, поэтому попробуйте и другие источники. Это хороший sitepoint.com/using-spl-iterators-1 Удачи! :)
Показать ещё 2 комментария
1

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

$path = '/path/to/dir/';
$shell_command = escapeshellcmd('find ' . $path .' ! -name "*.zip" -exec rm -r {}');
$output = shell_exec($shell_command);
  • 0
    Спасибо за ваш вклад, Майк, я понимаю, что shell - это король, но я пытаюсь найти решение только для PHP. Этот проект обслуживается xampp на Windows, ой.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню