为什么此代码仅适用于文件dirs.txt
中列出的最后一个目录,而不是处理该文件中列出的每个目录。在foreach
循环结束之前,它似乎忽略了while
语句。
<?php
$handle = fopen("dirs.txt", "r");
$tmpDir = "/tmp/";
if ($handle) {
while (($dir = fgets($handle)) !== false) {
foreach(glob($dir."*love*.mp3") as $file) {
if (!copy($file, $tmpDir.basename($file))) {
echo "Cant copy $file...\n";
}
}
}
} else {
}
fclose($handle);
?>
文件dirs.txt是新行分隔的目录列表
/home/mp3/
/home/music/
/etc/find/music/
我看不到任何错误,只是最后一个dir正在处理。所有目录都很好,文件存在于其中,所有这些都可以手动打开。如果我从文件中删除/ etc / find / music /,那么/ home / music /将会完成
答案 0 :(得分:1)
我怀疑fgets
返回文件中的每一行,换行符仍然附加到字符串的末尾。但是你的最后一个字符串(假设你没有在文件的末尾输入一个空行)将不包含换行符。如果是这种情况,那么glob
方法可能试图在目录路径中查找由换行符分成两个的文件,如下所示:
/home/mp3/
*love*.mp3
不能正确匹配。所以glob
函数返回一个空数组,这使得foreach循环无需处理,因此while
循环会跳到文件的下一行,直到最后一行才会出现同样的问题该文件的结尾,不以换行符结尾。
尝试将其插入while
循环的第一行:
$dir = trim($dir);
这应该删除任何换行符并使该字符串适合在glob
函数中使用。