2017-10-17 217 views
0

我想使用PHP重命名文件。PHP文件重命名 - 文件名中的非法字符

我循环遍历包含文件的目录,一旦找到文件,我想使用rename()来进行实际的重命名。

到目前为止这么简单。

问题是需要重命名的文件在文件名中包含非法字符。 我可以从名称中删除非法字符,但是当我想用新名称重命名文件时,找不到它。

所以一旦我到了可以使用的地步rename() PHP会发出警告:系统找不到指定的文件。 (代码:2)。

PHP似乎无法将文件识别为文件(is_file()返回false)。 有问题的文件是pdf文件,我可以在Acrobat Reader中没有任何问题的情况下打开它。 该文件是使用Quartz在Mac上生成的,我正在使用Windows。

有没有人有一个想法,我可以如何让PHP识别名称中的非法字符作为文件的文件?

PS

这是我的代码:

$dataDirectory = new RecursiveDirectoryIterator($folders); 

foreach ($dataDirectory as $dataName => $dataFileName) { 

    $isfile = is_file($dataFileName); // false for files with illegal character in filename 
    $result = rename($dataFileName, 'testname'); // generates warning mentioned above 

} 

回答

0

什么是服务器操作系统?

如果是Windows,那么您将无法使用UTF-8编码的文件名访问文件,因为PHP使用的CIO库的Windows实现只会在系统默认代码页中进行讨论。对于西欧安装,这是代码页1252可以转换为UTF-8串用iconv到CP1252:

$winfilename= iconv('utf-8', 'cp1252', $utffilename); 

(utf8_decode也可以使用,但它会给出错误的结果适用于Windows的扩展字符映射在cp1252中为0x80-0x9F。)

根据PHP和使用stdio的其他程序,系统代码页(例如希腊语)的名称包含在系统代码页之外的字符的文件根本无法访问。有脚本语言可以通过Win32 API使用原生Unicode文件名,但PHP5不是其中之一。

当然,当部署在文件系统采用UTF-8编码的其他操作系统上时,不应使用上述步骤。 (即现代Linux)

如果您需要与PHP无缝跨服务器兼容,则必须避免在文件名中使用非ASCII字符。抱歉。

+0

谢谢。您指出有脚本语言可以使用本地Unicode文件名。你能建议一个吗? – copossum

+0

Node.js就是一个例子。 –