2012-03-13 3 views
1

У меня есть две папки, у меня есть видео, а во втором - файлы конфигурации для каждого видео (3 файла на видео). Теперь, если я хочу удалить видео, я должен удалить файлы вручную. Я нашел это:unlink файлы с нечувствительным к регистру (glob-like) шаблоном

<?php 

$filename = 'name.of.the.video.xml';  
$term = str_replace(".xml","", $filename); 
$dirPath = ("D:/test/"); 

foreach (glob($dirPath.$term.".*") as $removeFile) 
{ 
    unlink ($removeFile); 
} 

?> 

эхо вернется:

D: /test/name.of.the.video.jpg

D: /test/name.of.the. video.srt

D: /test/name.of.the.video.xml

ли в порядке, и это помогает мне много, но у меня есть проблема.

Не все файлы одинаковы например: Name.of.The.video.jpg Name.Of.The.Video.xml

Если я эхо папку ищет эту строку и не тождественный с $ filename вернется пустым. Итак, мой вопрос в том, как я могу сделать этот поиск нечувствительным к регистру? Спасибо.

ответ

2

Вы используете функцию glob, которая чувствительна к регистру. Поэтому вы используете неправильную функцию, чтобы получить список файлов.

Поэтому вы должны сначала нормализовать имена файлов в каталоге, чтобы все они имели один и тот же случай (например, все строчные буквы). Или вам нужно использовать другой метод, чтобы получить список каталогов без учета регистра. Я предлагаю первое, но если это не вариант, почему бы вам не glob для всех файлов сначала, а затем отфильтровать список файлов с помощью preg_grep, который позволяет указать шаблоны, которые не чувствительны к регистру?

Что приводит меня к тому, что это более практически использовать DirectoryIterator с RegexIterator:

$filename = 'name.of.the.video.xml'; 
$term = basename($filename, ".xml"); 
$files = new DirectoryIterator($dirPath); 
$filesFiltered = new RegexIterator($files, sprintf('(^%s\\..*$)i', preg_quote($term))); 
foreach($filesFiltered as $file) 
{ 
    printf("delete: %s\n", $file); 
    unlink($file->getPathname()); 
} 

Хорошим примером гибкость Iterator сек коды ваши измененные требований: Сделайте это для двух каталогов в один раз. Вы просто создаете два DirectoryIterator s и добавляете один к другому с помощью AppendIterator. Работа выполнена. Остальная часть кода остается неизменной:

... 
$files = new AppendIterator(); 
$files->append(new DirectoryIterator($dirPath1)); 
$files->append(new DirectoryIterator($dirPath2)); 
... 

Voilá. Звучит хорошо? glob подходит для некоторых быстрых рабочих мест, которые нуждаются в этом. Для всего остального, когда операции с каталогом начинают рассматривать SPL. У него гораздо больше силы.

+0

$ removeFile = scandir ($ dirPath); print_r (preg_grep ("/ $ term/i", $ removeFile)); Я попробую с этим – akun

+0

@akun: Я добавил вам пример, а не то, что вы неправильно поняли, что я имел в виду. Речь идет об удалении файлов, поэтому будьте осторожны. – hakre

+0

@akun: Лучше возьмите 'DirectoryIterator'. – hakre

1

Действительно ли это функция strcasecmp() для этой функции? Его нечувствительная к регистру функция сравнения?

Несомненно, если вы знаете имя файла, и вы можете повторить его, вы можете передать это, чтобы отменить связь()?