0

我有一个目录列表代码,其中列出了特定目录中的所有文件。文件名有一个包含 az 和 0-9 以外的特定字符。它就像“i”上方没有点的小“i”。文件名为:“ClrmamePro Kullanımı English.mp4”。看看“Kullanımı”和“英语”。您可以看到“i”和“ı”之间的区别。

现在的问题是,当我列出目录时,php 会自动将字母“ı”转换为“i”,因此在执行重命名时出现错误

rename(E:/workspace/project/ClrmamePro Kullanimi English.mp4,
E:/workspace/project/movie_11.mp4) [<a href='function.rename'>function.rename</a>]: The system cannot find the file specified.

我有一个正则表达式来更正文件名,但由于 PHP 自动将“ı”转换为“i”,我无法捕捉到它。

目录列表的代码如下

function getDirectoryListing($directory) {
    // create an array to hold directory list
    $results = array();
    // create a handler for the directory
    $handler = opendir($directory);
    // open directory and walk through the filenames

    while ($file = readdir($handler)) {
        // if file isn't this directory or its parent, add it to the results
        if (strpos($file,'.') !== 0) {
            $results[] = $file;
        }
    }

    closedir($handler);
    // done!
    return $results;
}

echo '<pre>';
print_r(getDirectoryListing('movies'));
echo '</pre>';

得到的 o/pi 如下:

Array
(
    [0] => ClrmamePro Kullanimi English.mp4
    [1] => Download Gears of War 3 - eSoftZone.webm
    [2] => Facebook_ Science and the Social Graph.MP4
)

查看索引 0 处的第一个文件。我目录中的实际文件名是

ClrmamePro Kullanımı English.mp4
4

1 回答 1

0

对于movies目录中的每个文件,以下代码段会输出文件名以及文件是否存在。显示的文件名经过编码以正确显示特殊字符。

encode方法将字符串中的所有字符转换"$file "为 HTML 实体。该方法是对 Stack Overflow 文章“如何使用 PHP 将所有字符转换为其等效的 html 实体”中的解决方案稍作修改的版本。文章中找到的解决方案在我的 PHP 服务器上不起作用,所以我移到prependAmpersandAndPound了函数之外。

// https://stackoverflow.com/a/3005240/788324
function prependAmpersandAndPound($n) {
    return "&#$n;";
}
function encode($str) {
    $str = mb_convert_encoding($str , 'UTF-32', 'UTF-8');
    $t = unpack("N*", $str);
    $t = array_map(prependAmpersandAndPound, $t);
    return implode("", $t);
}

echo "<pre>\n";
$listing = getDirectoryListing('movies');
foreach ($listing as $file) {
    echo "\"" . encode($file) . "\" ";
    if (file_exists('movies/' . $file)) {
        echo "exists.\n";
    } else {
        echo "does not exist.\n";
    }
}
echo '</pre>';

模仿您的设置,上面的代码片段输出:

HTML 源代码:

<pre>
"&#68;&#111;&#119;&#110;&#108;&#111;&#97;&#100;&#32;&#71;&#101;&#97;&#114;&#115;&#32;&#111;&#102;&#32;&#87;&#97;&#114;&#32;&#51;&#32;&#45;&#32;&#101;&#83;&#111;&#102;&#116;&#90;&#111;&#110;&#101;&#46;&#119;&#101;&#98;&#109;" exists.
"&#67;&#108;&#114;&#109;&#97;&#109;&#101;&#80;&#114;&#111;&#32;&#75;&#117;&#108;&#108;&#97;&#110;&#305;&#109;&#305;&#32;&#69;&#110;&#103;&#108;&#105;&#115;&#104;&#46;&#109;&#112;&#52;" exists.
"&#70;&#97;&#99;&#101;&#98;&#111;&#111;&#107;&#95;&#32;&#83;&#99;&#105;&#101;&#110;&#99;&#101;&#32;&#97;&#110;&#100;&#32;&#116;&#104;&#101;&#32;&#83;&#111;&#99;&#105;&#97;&#108;&#32;&#71;&#114;&#97;&#112;&#104;&#46;&#77;&#80;&#52;" exists.
</pre>

在浏览器中显示:

"Download Gears of War 3 - eSoftZone.webm" exists.
"ClrmamePro Kullanımı English.mp4" exists.
"Facebook_ Science and the Social Graph.MP4" exists.
于 2012-06-01T13:04:41.607 回答