虽然在结束之前忽略了foreach的声明

时间:2014-09-14 19:03:57

标签: php foreach while-loop whitespace fgets

为什么此代码仅适用于文件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 /将会完成

1 个答案:

答案 0 :(得分:1)

我怀疑fgets返回文件中的每一行,换行符仍然附加到字符串的末尾。但是你的最后一个字符串(假设你没有在文件的末尾输入一个空行)将不包含换行符。如果是这种情况,那么glob方法可能试图在目录路径中查找由换行符分成两个的文件,如下所示:

/home/mp3/
*love*.mp3

不能正确匹配。所以glob函数返回一个空数组,这使得foreach循环无需处理,因此while循环会跳到文件的下一行,直到最后一行才会出现同样的问题该文件的结尾,不以换行符结尾。

尝试将其插入while循环的第一行:

$dir = trim($dir);

这应该删除任何换行符并使该字符串适合在glob函数中使用。