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

时间:2015-05-21 17:51:46

标签: php filesystems

我创建了一个包含一些文件的目录:

  • 的index.php
  • 此时就把one.txt存盘
  • two.txt
  • three.txt
  • four.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);
}
?>

现在,如果有人查看了index.php页面,这就是他们会看到的内容:

one.txt two.txt three.txt four.txt

从PHP代码中可以看出,index.php已列入黑名单,因此无法回显。

但是,我想比这更进一步,并回显每个文本文件的内容而不是文件名。使用新的PHP代码(我需要帮助创建),每当有人访问index.php页面时,这就是他们现在看到的内容:

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

Hello  ** this is what the file **one.txt** contains **

ok  ** this is what the file **two.txt** contains **

goodbye  ** this is what the file **three.txt** contains **

text  ** this is what the file **four.txt** contains **

总体:

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

5 个答案:

答案 0 :(得分:1)

您可以使用file_get_contents将文件放入字符串中。

<?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的glob函数仅过滤.txt个文件,如果您要向该目录添加更多文件,则不必将文件列入黑名单需要忽略。

以下是使用glob函数完成的方法。

<?php
   foreach (glob("*.txt") as $filename) {
      echo "$filename " . file_get_contents($filename) . "\n";
   }
?>

答案 1 :(得分:1)

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

<?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);
}
?>

我希望这会对你有所帮助。

答案 2 :(得分:1)

永远不要重新发明轮子。使用作曲家。

需要symfony/finder

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...
        }
    }
}

答案 3 :(得分:1)

我会给一些SPL filesystem iterators机会来完成这项任务:

$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());
}

这会递归地找到&amp;迭代给定目录中的所有.txt个文件,包括子目录。

由于迭代中的每个$file都是FilesystemIterator个实例,因此您可以使用all related methods来获取其他控件,例如$file->isLink()(符号链接为true),$file->isReadable() (对于不可读的文件是假的)等。

如果您不想查找子文件夹,只需更改第二行中的 RecursiveDirectoryIterator

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

为:

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

希望它有所帮助。

答案 4 :(得分:0)

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

$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文件搜索

时有用