Чтение имени файла на PHP

Я пытаюсь прочитать имена файлов из каталога, используя код и добавляя фильтр к файлам только для чтения с текущим годом и месяцем в имени файла, например

Julius Robles_Client11_20130508_10-42-42_AM.zip
Julius Robles_Client12_20130508_11-45-42_AM.zip
Julius Robles_Client13_20130508_11-58-42_AM.zip

поэтому код будет возвращать только файлы с 201305 в их именах, но он возвращает правильный отфильтрованный набор, но некоторые файлы отсутствуют, и я не знаю, почему?

также что такое файл "." и ".." хранятся в первых 2-х строках массива?

вот код

$filenames = array();
if ($handle = opendir('archive/search_logs/')) {
  $ctr = 0;
  while (false !== ($entry = readdir($handle))) {
    //if(strpos($entry,date('Ym')) !== false){
    $name = $entry;
    $entry = str_replace("-",":",$entry);
    $filenames[$ctr] = explode("_", $entry);
    $filenames[$ctr][] = $name;
    $ctr++;
  //}
}
  closedir($handle);
}

person Jericko Ramilo    schedule 08.05.2013    source источник
comment
. — текущая директория, .. — предыдущая директория; их можно пропустить   -  person Luceos    schedule 08.05.2013
comment
Когда вы говорите, что некоторые файлы отсутствуют, можете привести несколько примеров.   -  person James Holderness    schedule 08.05.2013
comment
Например, есть 10 файлов, в именах которых есть 201305, но код возвращает только 7 файлов.   -  person Jericko Ramilo    schedule 08.05.2013
comment
Какая разница в правах пользователя или пользователя? Создаются ли файлы автоматически в вашем коде?   -  person Luceos    schedule 08.05.2013


Ответы (2)


почему скандир? Используйте DirectoryIterator, не бойтесь использовать современный PHP

из мануала:

Класс DirectoryIterator предоставляет простой интерфейс для просмотра содержимого каталогов файловой системы.

пример:

<?php
$filenames = array();
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isFile()) {
        $filenames[] = $fileinfo->getFilename();
    }
}
print_r($filenames);

?>

с помощью DirectoryIterator вы можете проверить $fileInfo с помощью следующих методов:

  • DirectoryIterator::isDir — Определяет, является ли текущий элемент DirectoryIterator каталогом
  • DirectoryIterator::isDot — Определяет, является ли текущий элемент DirectoryIterator '.' или же '..'
  • DirectoryIterator::isExecutable — Определяет, является ли текущий элемент DirectoryIterator исполняемым
  • DirectoryIterator::isFile — Определяет, является ли текущий элемент DirectoryIterator обычным файлом
  • DirectoryIterator::isLink — Определяет, является ли текущий элемент DirectoryIterator символической ссылкой
  • DirectoryIterator::isReadable — Определяет, можно ли прочитать текущий элемент DirectoryIterator
  • DirectoryIterator::isWritable — Определяет, можно ли записать текущий элемент DirectoryIterator
person Robert    schedule 08.05.2013

Как сказано в комментарии:

. — текущий каталог .. — каталог выше этого

Вы можете пропустить оба для чтения каталога.

Лично я бы прочитал имя файла и информацию на основе регулярного выражения, например:

$filenames      = array();

foreach( scandir( 'archive/search_logs/' ) as $file ) {
    // test for current or higher path
    if( $file == "." || $file == ".." ) continue;
    // test if readable
    if( !is_readable( $file )) printf( "File %s is not readable",$file);
    // use regular expression to match: <filename><date:yyyymmdd>_<hours:hh>-<minutes:mm>-<seconds:ss>_<am|pm>.zip
    preg_match( "/(?<filename>[.]+)(?<date>[0-9]{8})\_(?<hours>[0-9]{2})\-(?<minutes>[0-9]{2})\-(?<seconds>[0-9]{2})\_(?<ampm>AM|PM)\.zip$/i" , $file , $matches );
    // now use anything in matches that suits your needs:
    echo $matches['filename'];
    echo $matches['date'];
    echo $matches['hours'];
    echo $matches['seconds'];
    echo $matches['ampm'];
}

Это не проверено, и я, возможно, переусердствовал с экранированием регулярных выражений - и _.


Что касается вашего вопроса, почему файл может быть недоступен, я думаю, этот вопрос относится к сбою сервера. Однако вы можете проверить права файлов с помощью fileperms(http://www.php.net/manual/en/function.fileperms.php), однако это не даст результатов, если они изначально нечитаемы.

person Luceos    schedule 08.05.2013