我想使用PHP重命名文件。
我循环遍历包含文件的目录,一旦找到文件,我想使用rename()进行实际的重命名。
到目前为止,一切都很简单。
问题是需要重命名的文件在文件名中包含非法字符。我可以去掉名称中的非法字符,但当我想使用新名称重命名文件时,却找不到它。
因此,一旦我可以使用rename(),PHP就会抛出一个警告:系统找不到指定的文件。(代码: 2)。
PHP似乎无法将文件识别为文件(is_file()返回false)。有问题的文件是pdf文件,我可以在Acrobat Reader中打开它,没有任何问题。该文件是在Mac上使用Quartz生成的,我使用的是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
}
发布于 2017-10-17 17:54:17
服务器操作系统是什么?
如果是Windows,您将无法访问使用UTF-8编码的文件名下的文件,因为PHP使用的C IO库的Windows实现只能在系统默认代码页中进行对话。对于西欧安装,这是代码页1252。您可以使用iconv将UTF-8字符串转换为cp1252:
$winfilename= iconv('utf-8', 'cp1252', $utffilename);
(也可以使用utf8_decode,但是对于映射到cp1252中0x80-0x9F范围的Windows扩展字符,它会给出错误的结果。)
名称中包含系统代码页指令表之外的字符的文件(例如,西方盒上的希腊语)根本不能被PHP和其他使用stdio的程序访问。有一些脚本语言可以通过Win32 API使用本机Unicode文件名,但PHP5不是其中之一。
当然,在文件系统采用UTF-8编码的不同操作系统上部署时,不应该使用上面的步骤。(即现代Linux。)
如果您需要与PHP无缝地跨服务器兼容,则必须避免在文件名中使用非ASCII字符。抱歉的。
https://stackoverflow.com/questions/46786817
复制相似问题