filemtime() [function.filemtime]: 带有元音变音符的文件名的 stat 失败

2022-08-31 01:14:18

我使用PHP函数filemtime来获取PHP 5.3的最后一次修改时间。此功能运行良好,但是当文件名具有特殊字符(例如元音变音符)时,它似乎存在一些问题。

如果我在带有元音变音符的文件名上运行它

$stat = filemtime('C:/pictures/München.JPG');

然后我得到输出:

Warning: filemtime() [function.filemtime]: stat failed for C:/pictures/München.JPG

如果我将文件从“München.JPG”重命名为“Muenchen.JPG”,然后再次执行相同的操作:

 $stat = filemtime('C:/pictures/Muenchen.JPG');

一切都很好!

我的PHP文件被保存为UTF-8,没有BOM,我也试过了:

clearstatcache();
$stat = filemtime(utf8_encode('C:/pictures/München.JPG'));

但它没有帮助。


答案 1

通过以下代码片段,我发现Windows 7上的文件编码是“ISO-8859-1”:

$scandir = scandir('.')
$encoding = mb_detect_encoding($scandir[0], 'ISO-8859-1, UTF-8, ASCII');
echo $encoding;

我已经读到utf8_decode将UTF-8字符串转换为ISO-8859-1,所以我最终得到了这个适用于我的项目的小代码:

$file = 'C:/pictures/München.JPG';
$lastModified = @filemtime($file);
if($lastModified == NULL)
    $lastModified = filemtime(utf8_decode($file));
echo $lastModified;

感谢所有提交评论的人。你把我引向了正确的方向。:-)


答案 2

试试这个

$dir    = 'uploads/';

        if (is_dir($dir)) { if ($dh = opendir($dir)) {

            while (($file = readdir($dh)) !== false) {                
                clearstatcache();
                if(is_file($dir."/".$file)) {                    
                    echo $file;
                    echo " - ";                    
                    echo "Last modified: " . date ("F d, Y H:i:s.", filemtime(utf8_decode($dir."/".$file)));
                    echo "<br>";
                }                
            }            

            echo "<br>";
            closedir($dh);
        }
    }

推荐