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