【问题标题】:php rename() Access is denied. (code: 5)php rename() 访问被拒绝。 (代码:5)
【发布时间】:2015-07-16 15:04:01
【问题描述】:

所以我尝试在 php 中使用重命名函数。

在第一次尝试时,如果目标文件夹为空或不包含与源文件夹同名的任何目录,则重命名功能可以完美运行。但是,如果有相同的目录名称,它会失败。我想要的只是覆盖它,我认为 rename() 就足够了。

这是我的代码:

/**
        *   Move temp folders to their permanent places
        *
        *   $module_folder = example (violator, pnp, etc)       
        *   $folders = name of folders within module_folder
        **/
        public function move_temp_to_permanent($module_folder, $folders){
            $bool = false;

            $module_folder_path = realpath(APPPATH . '../public/resources/temps/' . $module_folder);

            $module_folder_destination_path = $_SERVER['DOCUMENT_ROOT'] . '/ssmis/public/resources/photos/' . $module_folder . '/';

            foreach($folders as $folder){
                $bool = rename($module_folder_path . '/' . $folder, $module_folder_destination_path . $folder);
            }

            return $bool;
        }

上面的代码给了我一个错误提示:

消息: 重命名(C:\xampp\htdocs\ssmis\public\resources\temps\violator/SJ-VIOL-2015-0002,C:/xampp/htdocs/ssmis/public/resources/photos/violator/SJ-VIOL-2015- 0002): 访问被拒绝。 (代码:5)

我使用 CodeIgniter 作为框架。

非常感谢!

【问题讨论】:

  • 检查文件权限。
  • 正如我上面所说的,我能够成功使用 rename() 。但是,当我尝试使用它将文件夹从源移动到与资源同名的目标文件夹时,就会发生错误。既然我可以在目录上写,我还需要检查文件权限吗?
  • 一个目录下不能有同名文件夹,如果需要,需要检查同名文件夹和merge内容。
  • 有什么办法可以覆盖它吗?
  • 不知道这是否是问题,但您使用了混合目录分隔符。也许您应该使用 DIRECTORY_SEPARATOR 常量并在两条路径上执行 realpath。

标签: php codeigniter


【解决方案1】:

如果是在 Windows 上,这可以在贡献中阅读:

rename() 绝对不遵循 WinXP 和 PHP 5 上的 *nix 重命名约定。如果 $newname 存在,它将返回 FALSE 并且 $oldname 和 $newname 将保持其原始状态。你可以这样做:

function rename_win($oldfile,$newfile) {
    if (!rename($oldfile,$newfile)) {
        if (copy ($oldfile,$newfile)) {
            unlink($oldfile);
            return TRUE;
        }
        return FALSE;
    }
    return TRUE;
}

Link.

【讨论】:

  • 这是我为解决问题所做的。我删除旧文件。谢谢。
【解决方案2】:

你在路径中添加额外的 / 使这个像

/**
        *   Move temp folders to their permanent places
        *
        *   $module_folder = example (violator, pnp, etc)       
        *   $folders = name of folders within module_folder
        **/
        public function move_temp_to_permanent($module_folder, $folders){
            $bool = false;

            $module_folder_path = realpath(APPPATH . '../public/resources/temps/' . $module_folder);

            $module_folder_destination_path = $_SERVER['DOCUMENT_ROOT'] . '/ssmis/public/resources/photos/' . $module_folder . '/';

            foreach($folders as $folder){
                $bool = rename($module_folder_path . $folder, $module_folder_destination_path . $folder);
            }

            return $bool;
        }

你也可以回显你准备的路径,这样你就可以检查它是否正确

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2016-01-24
    • 2018-02-10
    • 2020-05-03
    • 2013-09-03
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多