Почему fgets
и fopen
не могут «открыть поток», за исключением последней строки входного файла?
Я пытаюсь прочитать файл деревьев каталогов и текстовых файлов и открыть каждый файл.
filelist.txt
содержит:
a/1600/file.txt
b/1600/file.txt
c/1600/file.txt
Каталог:
c/1600/file.txt содержит текст directory c
Вывод в index.php таков:
Предупреждение: file_get_contents(a/1600/file.txt): не удалось открыть поток: Нет такого файла или каталога в /Users/joe/Sites/php/index.php в строке 9.
Предупреждение: file_get_contents(b/1600/file.txt): не удалось открыть поток: Нет такого файла или каталога в /Users/joe/Sites/php/index.php в строке 9.
каталог с
Почему выводится только содержимое c/1600/file.txt?
index.php (PHP 8.2):
$handle = fopen("filelist.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
$eachfilecontents = file_get_contents($line, true);
echo $eachfilecontents;
}
fclose($handle);
}
Я изменил ваш код, чтобы проверить файл, прежде чем перейти к следующему.
<?php
$handle = fopen("filelist.txt", "r");
if ($handle){
while(($line = fgets($handle)) !== false) {
$line = trim($line);
if (file_exists($line)){
$eachfilecontents = file_get_contents($line);
echo $eachfilecontents;
}
else{ echo "File not found: " . $line . "<br>"; }
}
fclose($handle);
}
?>
замените код файла index.php на этот, и он вернет вам данные из всех файлов.
этот код не имеет никакого смысла, поскольку он делает то же самое, что и код в OP: обрабатывает только последний файл
Я запустил код с той же ситуацией, что и в вопросе. оно работает. это из-за file_get_contents($file, true). => здесь, если мы удалим «,true», это сработает, потому что нам не нужно включать необходимые пути к файлам.
это работает из-за обрезки, а не из-за «удаления истины». в то время как добавление этого «проверочного файла» не имеет никакого смысла. Полагаю, вы не смогли понять код, который вам дал ChatGPT.
Соответствующая часть сообщения об ошибке — «Нет такого файла или каталога». Из документации fgets():
Чтение заканчивается, когда прочитано length - 1 байт или новая строка (которая включена в возвращаемое значение)
Если последняя строка работает, это потому, что в файле нет последней новой строки.
Вы можете, например. подстригите сами:
$eachfilecontents = file_get_contents(rtrim($line), true);
Кстати, я не понимаю, почему вы используете функцию file_get_contents() с флагом use_include_path
, это звучит как ненужное бремя.
Спасибо! Я только изучаю PHP на примерах и ответах на SE. Использование false с use_include_path работает. Мой следующий шаг таков: файл file.txt на самом деле содержит HTML, и я хочу проанализировать один URL-адрес в каждом файле и вывести его; я бы использовал preg_match_all?
Классический вопрос: анализ HTML с помощью регулярных выражений 😛 PHP может анализировать HTML изначально: DOM.
Спасибо! Я обнаружил DOM после того, как оставил вам комментарий; и это ответ на мой вопрос stackoverflow.com/questions/2180255/…