如何用PHP遍历文本文件并按每行内容动态创建对应文件?
解决PHP遍历文件创建对应txt文件的问题
我来帮你排查下问题哈~你的代码里有几个关键问题导致只生成了最后一个文件:
- 重复调用
fgets():你在循环里先echo fgets($file),然后又$fileName = fgets($file),这意味着每次循环会读取两行内容——第一行用来输出,第二行用来创建文件,这样直接跳过了一半的行,最后自然只处理到了最后一行。 - 语法错误:
fopen($fileName.'.txt, "w")这里的引号没闭合正确,应该是fopen($fileName . '.txt', "w"),少了一个双引号的闭合,这会导致代码报错(只是可能你没看到错误提示)。 - 未处理换行符:
fgets()会把每行末尾的换行符(\n或者\r\n)也读进来,直接用来当文件名的话,会创建出带换行的奇怪文件名,比如red\n.txt,这显然不是你想要的。
修正后的代码
<?php // 打开files.txt文件 $file = fopen("files.txt", "r"); if ($file) { // 循环读取每一行,直到文件结束 while (($line = fgets($file)) !== false) { // 去除换行符和首尾空白字符(空格、制表符等) $fileName = trim($line); // 跳过空行,避免创建无效文件名的文件 if (empty($fileName)) { continue; } // 输出当前处理的文件名 echo $fileName . "<br />"; // 创建对应的xxx.txt文件,注意引号的正确闭合 $myfile = fopen($fileName . '.txt', "w"); // 关闭创建的文件,释放资源 fclose($myfile); } // 关闭源文件 fclose($file); } else { // 处理文件打开失败的情况 echo "无法打开files.txt文件,请检查文件路径和权限!"; } ?>
关键改进说明
- 单次读取每行内容:把
fgets()的结果存入变量$line,避免重复读取导致的行跳过问题。 - 清理文件名:用
trim()处理每行内容,确保文件名不含换行符和多余空白。 - 语法修复:修正了
fopen函数里的引号闭合错误。 - 空行处理:增加空行判断,防止创建无效的空文件名文件。
- 错误处理:添加了文件打开失败的提示,方便排查问题。
- 资源释放:每次创建文件后调用
fclose($myfile),养成良好的资源管理习惯。
内容的提问来源于stack exchange,提问作者Mona Coder
相关产品推荐
相关产品推荐

