我正在尝试将dir中的所有文件合并到一个带有PHP的文本文件中。
所有文件都是文本文件,每行都有一个单词。
我只需将它们全部合并到一个文本文件中,包含所有单词,每行一个。
文件扩展名为0-5(。10,。15,.20,.25)和.txt文件的0-5倍数。
这是我到目前为止所做的,但它只会生成一个空文本文件。
<?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>
答案 0 :(得分:2)
问题是read / append循环无法正确读取。如果您不处理非常大的文件,那么您可以将其简化为
foreach ($files as $file) {
fwrite($out, file_get_contents($file));
}
答案 1 :(得分:2)
您的代码有两个问题:
对fread()的调用需要一个参数,指示您可以为该文件读取的最大字符数。它不优雅,但您可以将其设置为20(如果文件较长,则会执行while循环直到消耗掉所有内容)。
while($line = fread($in,20)){
fwrite($out, $line);
echo "writing file";
}
这可能是一个问题或注意事项,但你的glob语句中写着'。??'。所以你可以捕获像“foo.55”这样的文件,但不能捕获“bar.5”或“mine.100”。您可能希望将其更改为“。[0-9] *”
$files = glob("./*.[0-9]*");
答案 2 :(得分:1)
如果可以的话(例如,如果你不需要在连接之前处理文件并拥有适当的操作系统),那么最好的方法是尽可能地处理操作系统:
exec('cat *.?? > listTogether.txt');
如有必要,您可以在命令本身内更改工作目录(通过附加&#34; cd /some/other/directory &&
&#34;,考虑到有关路径的安全模式限制),或使用chdir()