我在通过unlink()
功能删除文件时遇到问题。当文件具有西里尔文名称时,该功能不起作用。
[2012年7月24日00:33:35 UTC] PHP警告: unlink(/home/gtsvetan/public_html/мениджър.doc)[function.unlink]:没有这样的文件或目录 在第114行的/home/gtsvetan/public_html/deleter.php
那么当名称被cyrillized时如何删除文件?
代码是:
$dir = is_array($dir) ? $dir : explode(',', $dir);
foreach($dir as $dirv) {
if(is_dir($dirv)) {
$objects = scandir($dirv);
foreach($objects as $object) {
if($object != "." && $object != "..") {
if(filetype($dirv."/".$object) == "dir") {
$this->delete($dirv."/".$object);
}
else {
unlink($dirv."/".$object);
}
}
}
reset($objects);
rmdir($dirv);
}
else {
unlink($dirv);
}
}
解决方案:
public function delete($dir) {
$dir = is_array($dir) ? $dir : explode(',', $dir);
foreach($dir as $dirv) {
if(is_dir($dirv)) {
$d = @dir($dirv) or die();
while(false !== ($entry = $d->read())) {
if($entry[0] == ".") {
continue;
}
if(is_dir($dirv.$entry.'/')) {
$this->delete($dirv.$entry.'/');
@rmdir($dirv.$entry);
}
elseif(is_readable($dirv.$entry)) {
@unlink($dirv.$entry);
}
}
$d->close();
}
else {
@unlink($dirv);
}
@rmdir($dirv);
}
}
这是ajax.php,它构成了类的实例:)
case 'delete':
$location = $_POST['location'];
if(is_array($location)) {
foreach($location as $v) {
$loc[] = iconv('utf-8', 'cp1251', $v);
}
$pfm->delete($loc);
}
else {
$location = iconv('utf-8', 'cp1251', $location);
$pfm->delete($location);
}
break;
它对我来说很完美:)
答案 0 :(得分:0)
如果效果不好,我建议先重新命名。
答案 1 :(得分:0)
我发现清理文件名始终是个好主意。我个人喜欢让我的脚本命名文件本身,而不是用户(特别是如果它是一个上传的文件)。创建一个转换西里尔字符的清洁功能。看看convert_cyr_string :: http://php.net/manual/en/function.convert-cyr-string.php
另一个想法,重命名文件与删除它们有同样的问题吗?如果没有,请将其重命名为tobedeleted.ext,然后取消链接。
答案 2 :(得分:0)
unlink
只是转发到相应的系统调用。文件名将按原样传递给该函数,因为PHP字符串只是不透明的字节序列。这意味着名称需要采用系统调用理解的编码。换句话说,这取决于您的操作系统。您还需要知道文件名的当前编码是什么;这取决于输入的来源。
如果您知道系统调用需要UTF-8(在Linux上是正确的)并且当前名称在ISO-8859-5中,则使用iconv
的解决方案看起来像
unlink(iconv('iso-8859-5', 'utf-8', $dirv."/".$object));
当然,您也可以使用mb_convert_encoding
执行相同操作。所有其他与文件系统相关的调用也需要相同的处理。
答案 3 :(得分:0)
嗯,我做了这个,它可能会有用。
<?php
function delete($link) {
foreach($link as $u) {
if(is_dir($u)) {
delete(glob($u . DIRECTORY_SEPARATOR . "*"));
rmdir($u);
} else; unlink($u);
}
return;
}
delete(glob(__DIR__ . DIRECTORY_SEPARATOR . "*"));
?>