我正在尝试将一个目录中的所有文件合并为一个PHP文本文件。
所有的文件都是文本文件,每行有一个单词。
我只需要把它们合并成一个包含所有单词的文本文件,每行一个。
文件扩展名是数字0-5的5倍。. 10, .15, .20, .25)和。txt文件。
这就是我目前所做的,但它只生成一个空文本文件。
<?php
$files = glob("./*.??");
$out = fopen("listTogether.txt", "w");
foreach($files as $file){
$in = fopen($file, "r");
while($line = fread($in)){
fwrite($out, $line);
echo "writing file";
}
fclose($in);
}
fclose($out);
?>
<!Doctype HTML>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>file merger</title>
</head>
<body>
<p>Doo Wop</p>
</body>
</html>
问题是read/append循环不能正确读取。如果你不是在处理非常大的文件那么你可以把它简化为
foreach ($files as $file) {
fwrite($out, file_get_contents($file));
}
你的代码有两个问题:
-
对fread()的调用需要一个参数来指示您可以为该文件读取的最大字符数。它不是很优雅,但您可以将其设置为20之类的值(如果文件较长,则while循环将执行,直到所有内容都被消耗掉)。
while($line = fread($in,20)){ fwrite($out, $line); echo "writing file"; }
-
这可能是一个问题或注意事项,但您的glob语句显示'.??'。因此,您可以捕获像"foo。55英寸,但不是55英寸。5"或"mine.100"。您可以将其更改为".[0-9]*"
$files = glob("./*.[0-9]*");
如果你可以(例如:如果您不需要在连接之前处理文件,并且有合适的操作系统),真正可取的方法是尽可能靠近操作系统处理它:
exec('cat *.?? > listTogether.txt');
如果有必要,您可以在命令本身中更改工作目录(通过附加" cd /some/other/directory &&
",考虑到有关路径的安全模式限制),或者使用chdir()
。