Я стараюсь, чтобы жизнь меня находила лучший способ удалить все файлы в одном каталоге, исключая одно расширение файла, то есть все, что не является .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
файлом.
Любая помощь/совет приветствуются.
Это должно сработать для вас:
(Я просто использую array_diff()
чтобы получить все файлы, которые отличаются от *.zip
а затем я просматриваю эти файлы и отключаю их)
<?php
$files = array_diff(glob("*.*"), glob("*.zip"));
foreach($files as $file) {
if(is_file($file))
unlink($file); // delete file
}
?>
$exclude = array("zip");
$files = glob("output/*");
foreach($files as $file) {
$extension = pathinfo($file, PATHINFO_EXTENSION);
if(!in_array($extension, $exclude)) unlink($file);
}
Этот код работает, имея массив исключенных расширений, он загружает все файлы в каталог, а затем проверяет расширение каждого файла. Если расширение находится в списке исключений, оно не удаляется. Иначе это так.
PATHINFO_EXTENSION
Я просто хотел бы узнать простейший/наиболее эффективный способ удаления всех файлов в одном каталоге, который не является.zip файлом.
Итераторы SPL очень эффективны и эффективны.
Это то, что я буду использовать:
$folder = __DIR__;
$it = new FilesystemIterator($folder, FilesystemIterator::SKIP_DOTS);
foreach ($it as $file) {
if ($file->getExtension() !== 'zip') {
unlink($file->getFilename());
}
}
Как насчет вызова в оболочку? Итак, в Linux:
$path = '/path/to/dir/';
$shell_command = escapeshellcmd('find ' . $path .' ! -name "*.zip" -exec rm -r {}');
$output = shell_exec($shell_command);
Вы пробовали это:
$path = "dir/";
$dir = dir($path);
while ($file = $dir->read()) {
if ($file != "." && $file != ".." && substr($file, -4) !== '.zip') {
unlink($file);
}
}