当前位置: 首页 > 知识库问答 >
问题:

php解除关联函数

仲智
2023-03-14

我在通过unlink()函数删除文件时遇到问题。当文件名为西里尔字母时,该函数不起作用。

[24-Jul-2012 00:33:35 UTC]PHP警告:取消链接(/home/gtsvetan/public_html/МъжъУ.doc)[function.unlink]:在/home/gtsvetan/public_html/deleter中没有这样的文件或目录。php在线114

那么,当名称被西里尔化时,如何删除该文件呢?

代码是:

$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;

它非常适合我:)

共有3个答案

杜嘉慕
2023-03-14

从PHP取消链接只需转发到相应的系统调用。文件名将按原样传递给该函数,因为PHP字符串只是不透明的字节序列。这意味着名称需要采用系统调用能够理解的编码。换句话说,这取决于你的操作系统。您还需要知道文件名的当前编码是什么;这取决于输入来自何处。

如果您知道系统调用需要UTF-8(这在Linux是真的),并且当前名称是在ISO-8859-5中,那么使用iconv的解决方案将如下所示

unlink(iconv('iso-8859-5', 'utf-8', $dirv."/".$object));

当然,您也可以对mb\u convert\u编码进行同样的操作。对于所有其他与文件系统相关的调用,同样的处理也是必要的。

费凯康
2023-03-14

我发现清理文件名总是一个好主意。就我个人而言,我喜欢脚本名称文件本身,而不是用户(尤其是上传的文件)。创建一个用于转换西里尔字符的清理函数。请看convert\u cyr\u string::http://php.net/manual/en/function.convert-cyr-string.php

另一个想法是,重命名文件和删除文件有相同的问题吗?如果没有,请将其重命名为tobedeleted。然后取消链接。

康元凯
2023-03-14

如果播放效果不好,我建议先改名。

 类似资料:
  • 我有一个非常简单的功能: 该文件在执行后显示不可读,并从文件目录中消失。但是,当从浏览器访问时,它仍然可用,尽管没有缓存(在不同的浏览器上打开文件进行测试)。我是不是错过了什么?文件是否被服务器缓存?这是我能想到的唯一解释。

  • 我正忙于学习一本关于php的书,他们有一个关于从数据库中删除记录的练习。我遇到的问题是删除与数据库项关联的图像。我有一个定义常数: 在一个叫appvars.php.的文件里这是remove.php 数据库100%删除条目,但我得到一个错误,图像是一个目录。如果查看html,它会将路径报告为images/imageName。gif 我添加了is_file(),试图弄清楚发生了什么,结果现在我得到了分

  • 问题内容: 我有一个看起来像这样的PHP数组: 当我var_dump数组值我得到这个: 我想删除“ 已完成” 和“ 标记为垃圾邮件” 。我知道可以,但是问题是有时索引号可能会不同。 是否可以通过匹配值名称而不是键值来删除它们? 问题答案: 您的数组很奇怪: 为什么不只使用as索引,以及as …值? 如果这样声明数组,会不会容易得多: 那将允许您使用as 的值作为索引来访问数组。 而且您将能够使用函

  • 本文向大家介绍php通过array_merge()函数合并关联和非关联数组的方法,包括了php通过array_merge()函数合并关联和非关联数组的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php通过array_merge()函数合并关联和非关联数组的方法。分享给大家供大家参考。具体分析如下: array_merge()是一个用于合并数组的php函数,后一个数组追加到前一个的结

  • 接口说明 如果已建立了主屏与副屏之间的关联,而由于某些原因,不想再进行两个场景之间数据的差异对比,Wish3DEarth团队新增了删除关联场景的接口,开发者可以通过该接口,来解除主屏与副屏之间的关联性。 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/contrasts/1.0.0/del 是否需要登录 是 请求字段说明

  • 问题内容: 我有一个关联数组,但是当我使用以下函数向其添加值时,它似乎会覆盖相同的键。有没有办法让多个相同的键具有不同的值?还是存在具有相同格式的另一种形式的数组? 我希望有: 码: 问题答案: 不可以,关联数组中不能有多个相同的键。 但是,您可以拥有唯一的键,每个键的对应值都是数组,并且这些数组的每个键都有多个元素。 所以代替这个… …你有这个: