如何循环所有文件夹并打开它,读取文件将 放在每行的末尾,使其成为一行,并将其保存为新文件


How to loop all folders and open it, read file put on the end of each line and make it a single line and save it as a new file

我有一个目录,里面有很多文件夹每个文件夹都有一个包含url的文本文件我要做的是创建一个php代码打开每个文件夹的文本文件然后编辑它让url变成一行用'n字符分隔每个url

这是我到目前为止的代码

$path = "localpath here";
$handle = opendir($path);
while ($file = readdir($handle)) {
    if(substr($file,0,1) !="."){
        $text = preg_replace('/'s+/', '', $file);
        //echo $text."</br>";
        $blast = fopen("$path/$text/$text.txt", 'r') or die("can't open file");
        //echo $blast;
        while (!feof($blast)) {
            $members[] = fgets($blast);
            //echo $members;
        }
    }
}
foreach($members as $x=> $order){
    echo $order."</br>";
    $string = trim(preg_replace('/'s+/', ' ', $order));
    $linksonly = "write.txt";
    $linksonlyHandle = fopen("$path/$text/$linksonly", 'a') or die("can't open file");
    fwrite($linksonlyHandle,$string.''n');
    fclose($linksonlyHandle);
}
closedir($handle);

似乎您希望$text在foreach()循环中是动态的,但它保留了while()循环的最后一次迭代的值。

您可能需要为$text创建另一个数组,以便与foreach()循环中的$member[]使用相同的索引。

$i=0;
$j=0;

$members[$i] = fgets($blast);
$text_array[$i] = $text;
$i++;

$linksonlyHandle = fopen("$path/{$text[$j]}/$linksonly", 'a') or die("can't open file");
$j++;

如果我正确理解了你想要完成的任务,那么你有一些问题需要解决。如果您要沿着目录树向下走,那么您可能需要创建一些函数并递归地执行。此外,您还需要检查从readdir获取的$file是一个文件还是另一个目录。您可以使用is_dir函数来做到这一点。如果它是一个目录,那么您将需要在其中查找更多的文件(和目录)。这就是为什么使用递归函数是有用的。

我通常这样做:

function import_directory($directory)
    {
    $files = scandir($directory);
    foreach ($files as $file)
        {
        if ($file == '.' || $file == '..')
            continue;
        if (is_dir($directory.'/'.$file))
            $this->import_directory($directory.'/'.$file);
        else
            $this->import_file($directory.'/'.$file);
        }
    }

这个例子使用了scandir而不是readdir,但是您可以理解其中的意思。它检查下一个"文件"是目录还是文件,如果是目录,则再次调用相同的import_directory函数。如果它是一个文件,那么你可以做任何你需要做的工作。在您的例子中,这听起来像是读入文件的内容,稍微修改内容,然后将其写入另一个文件。

要回答关于为什么文件只在包含所有内容的最后一个文件夹中创建的特定问题,这是因为您对目录内容执行了完整的while循环(每次更新$members数组)。该循环完成后,在foreach中只处理一次$members数组。为了使它更像您期望的那样工作,您需要在读取文件后将处理$members数组(即文件的内容)的foreach循环移动到主while循环中。或者更好的是,由于您每次读取一行文件的内容(使用fgets),您可以在相同的循环中将该行写入新文件(例如,读取一行,写入一行)。

但是当涉及到处理目录树时,我真的建议使用递归函数,因为它使它更简单,更容易理解-至少对我来说!