Как ссылаться на текущее имя каталога, имя файла и содержимое файла с помощью цикла RecursiveDirectoryIterator?

В приведенном ниже сценарии я пытаюсь перебрать папки и файлы внутри папки $base. Я ожидаю, что он будет содержать один уровень дочерних папок, каждая из которых содержит несколько файлов .txt (без подпапок).

Мне просто нужно понять, как ссылаться на элементы в комментариях ниже...

Любая помощь высоко ценится. Я действительно близок к завершению этого :-)

$base = dirname(__FILE__).'/widgets/';
$rdi = new RecursiveDirectoryIterator($base);
foreach(new RecursiveIteratorIterator($rdi) as $files_widgets) 
    {
     if ($files_widgets->isFile()) 
         {
            $file_name_widget = $files_widgets->getFilename(); //what is the filename of the current el?
            $widget_text = file_get_contents(???); //How do I reference the file here to obtain its contents?
            $sidebar_id = $files_widgets->getBasename(); //what is the file's parent directory name?
        }
    }

person Scott B    schedule 22.03.2011    source источник
comment


Ответы (1)


//How do I reference the file here to obtain its contents?
    $widget_text = file_get_contents(???); 

$files_widgets — это SplFileInfo, поэтому у вас есть несколько вариантов получения содержимого файла.

Самый простой способ — использовать file_get_contents, как сейчас. Вы можете объединить путь и имя файла:

$filename = $files_widgets->getPathname() . '/' . $files_widgets->getFilename();
$widget_text = file_get_contents($filename);

Если вы хотите сделать что-то забавное, вы также можете использовать openFile, чтобы получить SplFileObject. Досадно, что у SplFileObject нет быстрого способа получить все содержимое файла, поэтому нам нужно построить цикл:

$fo = $files_widgets->openFile('r');
$widget_text = '';
foreach($fo as $line)
    $widget_text .= $line;
unset($fo);

Это немного более подробно, так как нам нужно перебрать SplFileObject, чтобы получить содержимое построчно. Хотя это вариант, вам будет проще использовать file_get_contents.

person Charles    schedule 22.03.2011
comment
благодаря. Мне просто нужно было удалить вторую часть, чтобы она стала $filename = $files_widgets->getPathname(); - person Scott B; 22.03.2011
comment
+1 Теперь мне осталось только получить имя текущего каталога (он же родитель текущего файла). Я не вижу метода, а вы? - person Scott B; 22.03.2011
comment
Понятно › $parentname = basename($files_widgets-›getPath()); - person Scott B; 22.03.2011