Php 如何回显目录中每个文本文件的内容?

Php 如何回显目录中每个文本文件的内容?,php,filesystems,Php,Filesystems,我创建了一个目录,其中包含一些文件: index.php 1.txt 2.txt 3.txt 4.txt 在index.php页面中,我当前正在使用此代码呼出目录中的所有文件: <?php $blacklist = array("index.php"); if ($handle = opendir('.')) { while (false !== ($entry = readdir($handle))) { if ($entry != "." &&

我创建了一个目录,其中包含一些文件:

  • index.php
  • 1.txt
  • 2.txt
  • 3.txt
  • 4.txt
index.php
页面中,我当前正在使用此代码呼出目录中的所有文件:

<?php
$blacklist = array("index.php");

if ($handle = opendir('.')) {

    while (false !== ($entry = readdir($handle))) {

        if ($entry != "." && $entry != ".." &&  !in_array($entry, $blacklist)) {
            echo "$entry\n";
        }

    }

    closedir($handle);
}
?>
正如您从PHP代码中看到的,
index.PHP
被列入黑名单,因此它不会被呼出

然而,我想更进一步,呼出每个文本文件的内容,而不是文件名。有了新的PHP代码(我需要帮助创建),每当有人访问
index.PHP
页面时,他们就会看到:

(请忽略星号中的内容,它们不是代码的一部分,它们只是指示每个文本文件包含的内容)

总体而言:

我想回显目录中每个文件的内容(它们都是文本文件),除了
index.php

,您可以使用它将文件放入字符串中

<?php
   $blacklist = array("index.php");

   if ($handle = opendir('.')) {

      while (false !== ($entry = readdir($handle))) {

          if ($entry != "." && $entry != ".." &&  !in_array($entry, $blacklist)) {
              echo "$entry " . file_get_contents($entry) . "\n";
          }

       }

      closedir($handle);
   }
?>

这将打印文件的内容。如果路径不是当前路径并在文件内容之间写入某种边界,则可以进行一些变通

<?php
$blacklist = array("index.php");

if ($handle = opendir('.')) {

    while (false !== ($entry = readdir($handle))) {

        if ($entry != "." && $entry != ".." &&  !in_array($entry, $blacklist)) {
            echo  file_get_contents($entry) . "\n";
        }

    }

    closedir($handle);
}
?>


我希望这对您有所帮助。

正如@brock-b所说,您可以使用获取完整的文件列表并获取内容:

$blacklist = array('index.php');

$files = glob('*.txt'); # could be *.* if needed
foreach ($files as $file) {
    if (!in_array(basename($file), $blacklist)) {
        echo file_get_contents($file);
    }
}

注意:由于您正在查找
*.txt
文件,因此不会进入黑名单。仅在执行
*.*
*.php
文件搜索时有用。永远不要重新发明轮子。使用作曲家

要求


我会给一些人一个完成这项任务的机会:

$dir = '/home/mydirectory';
$rdi = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS);
$rdi = new \RegexIterator($rdi, '/\.txt$/i');
$iterator = new \RecursiveIteratorIterator($rdi, \RecursiveIteratorIterator::CHILD_FIRST);

foreach ($iterator as $file) {
    echo 'Contents of the '.$file->getPathname().' is: ';
    echo file_get_contents($file->getPathname());
}
这将递归地查找并迭代给定目录中的所有
.txt
文件,包括子目录

由于迭代中的每个
$file
都是一个
文件系统发射器
实例,因此您可以使用其他控件,如
$file->isLink()
(对于符号链接为true)、
$file->isReadable()
(对于不可读的文件为false)等

如果不需要查找子文件夹,只需将第二行中的递归DirectoryIterator更改为:

$rdi = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS);
致:


希望能有所帮助。

对于问题的第一个版本,我倾向于建议不要要求如何接受你的问题,以及人们应该(不)如何投票,因为这样做可能会导致你想要避免的否决票。就目前而言,这个问题相当清楚,我不希望它被否决。然而,这可能需要解释一下您所坚持的内容-您似乎在询问如何将文件读入变量,这可能是使用搜索引擎可以找到的。请参阅此处:-第一个结果!这似乎只是在呼应一个文件中的内容four@Osman查看源代码以确保代码实际上只打印一个文件。我不明白为什么这个代码应该fail@Osman:我并不想过分挑剔,但你可能会因为没有进行任何调试而被否决。现在你有了一些代码可以使用,你能在你的开发机器上回显变量,看看问题出在哪里吗?@Osman-虽然我同意代码不应该失败,但如果你想使用glob函数来清理代码并使其更易于维护,我还添加了解决方案。应该注意,
glob(“*.txt”)
还将匹配具有该名称的目录,而不仅仅是文件。这些问题以前遇到过并解决过。这是您问题的一个答案:
这个答案如何比已经提供的任何解决方案更有用?
phpBB和Laravel使用Finder是有原因的。这似乎只是呼应了一个fi的内容le of the four如果您以
$entry
的形式循环目录中的所有文件,那么每次循环该
while
语句时,
$entry
变量应该包含不同的文件名,因此它应该打印目录中所有文件的内容。这个答案比任何已经存在的解决方案更有用吗rovided?此外,这可以被视为是对轮子的重新发明,而不是使用内置的PHP函数。Symfony的finder组件编写得很好,是一个很好的库,可以完成与文件系统相关的任务,它使用SPL迭代器。我还在下面写了一个答案,它不依赖于任何第三方库。@Brock:解决问题的不同方法欢迎您来这里-在某种程度上,越多越好?
:-)
$blacklist = array('index.php');

$files = glob('*.txt'); # could be *.* if needed
foreach ($files as $file) {
    if (!in_array(basename($file), $blacklist)) {
        echo file_get_contents($file);
    }
}
use Symfony\Component\Finder\Finder;

class Foo
{
    public function getTextFileContents($dir)
    {
        $finder = (new Finder())->files()->name('*.txt');
        foreach ($finder->in($dir) as $file) {
            $contents = $file->getContents();
            // do something while file contents...
        }
    }
}
$dir = '/home/mydirectory';
$rdi = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS);
$rdi = new \RegexIterator($rdi, '/\.txt$/i');
$iterator = new \RecursiveIteratorIterator($rdi, \RecursiveIteratorIterator::CHILD_FIRST);

foreach ($iterator as $file) {
    echo 'Contents of the '.$file->getPathname().' is: ';
    echo file_get_contents($file->getPathname());
}
$rdi = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS);
$rdi = new \DirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS);