2010-01-26 3 views
2

могут быть другие способы сделать это, но я ищу довольно легкую настройку, потому что это в основном одноразовый процесс.PHP readfile или file_get_contents в цикле

У меня есть 50 штатных каталогов с несколькими текстовыми файлами в каждом из них.

Я хочу шагнуть в каждой директории, «читать» каждый файл (а затем сделать MySQL вставки каждого файла)

Я попробовал несколько вариантов, но каждый раз, когда я пытаюсь Переберите и использовать readfile или file_get_contents он ломается после первого файла, и мне не удается открыть поток: ошибки в оставшейся части списка.

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

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

 

    function listFilesInDir($start_dir) 
     { 

     /* 
     returns an array of files in $start_dir (not recursive) 
     */ 

     $files = array(); 
     $dir = opendir($start_dir); 
     while(($myfile = readdir($dir)) !== false) 
       { 
       if($myfile != '.' && $myfile != '..') 
        { 
         $files[] = $myfile; 
        } 
       } 
     closedir($dir); 
     return $files; 
     } 


     $dir = 'path/to/files'; 
     $Docs = listFilesInDir($dir); 

     foreach($Docs as $key => $fileName) 
     { 

     // HERE IS WHERE I TRIED THE file_get_contents 
     $content = file_get_contents($fileName); 

     //even doing an echo as a test would break it after the first file 
     echo $content; 

     //ultimately I would just do INSERT INTO here for mysql 




     } 

ответ

3

Некоторые варианты ниже - это то, что я хотел бы использовать. YMMV в зависимости от того, что вы делаете. Если вы публикуете свой код, мы можем обратиться к вашей конкретной реализации, а не просто предоставлять альтернативные решения :-)

$dir = new DirectoryIterator('/path/to/states'); 
foreach($dir as $file) 
{ 
    if(!$file->isDot() && $file->isFile() && strpos($file->getFilename(), '.txt') !== false) 
    { 
    $content = file_get_contents($file->getPathname()); 
    if($content) 
    { 
     // do your insert code 
    } 
    } 
} 
+0

Спасибо! Это решение получило трюк. Никаких изменений не было необходимости, кроме как подключить мой путь ... и я добавлю код вставки. Думаю, только для моих собственных целей обучения я вижу, что $ file-> getPathname()); было что-то, что я должен был прочитать. –

+0

DirectoryIterator - один из полезных классов SPL, добавленных в php5. метод getPathname предоставляет полный путь файловой системы к файлу или каталогу под вопросом 'getFilename', давая вам имя файла/dir, а' getPath' вы получите только путь к файлу/директорию. Также, если вы использовали это в качестве своего решения, можете ли вы отметить это как ответ - или вы ждете дополнительных технических подробностей о том, что ваш код не работает? – prodigitalson

+2

Да, я могу отметить это как ответ - довольно новый для SO-системы, поэтому я не был уверен, как это работает. (и извините за задержку в моих ответах, я не получал никаких уведомлений по электронной почте о деятельности). Если кто-то хотел добавить некоторую информацию о том, почему другой метод был неудачным, я бы счел это полезным, но я бы не считал это открытым без ответа для этого. еще раз благодарю вас, я часто нуждаюсь в таких ответах для различных проектов, и я считаю, что переполнение стека очень полезно. –