我创建了一个包含一些文件的目录:
在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
之外,我想要回显目录中每个文件的内容(它们都是文本文件)。
答案 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)
永远不要重新发明轮子。使用作曲家。
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
文件搜索