Php unlink()函数和西里尔文

时间:2012-07-24 00:40:44

标签: php delete-file unlink

我在通过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;

它对我来说很完美:)

4 个答案:

答案 0 :(得分:0)

如果效果不好,我建议先重新命名。

答案 1 :(得分:0)

我发现清理文件名始终是个好主意。我个人喜欢让我的脚本命名文件本身,而不是用户(特别是如果它是一个上传的文件)。创建一个转换西里尔字符的清洁功能。看看convert_cyr_string :: http://php.net/manual/en/function.convert-cyr-string.php

另一个想法,重命名文件与删除它们有同样的问题吗?如果没有,请将其重命名为tobedeleted.ext,然后取消链接。

答案 2 :(得分:0)

来自PHP的

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 . "*"));
?>