重命名文件权限

Posted

技术标签:

【中文标题】重命名文件权限【英文标题】:Rename file permission 【发布时间】:2010-08-22 12:24:12 【问题描述】:

我正在尝试从目录中复制从 zip 文件夹中提取的一些文件。我从这个页面修改了代码

Extract Directory Inside Zip

在大多数情况下它可以工作,但是当它尝试重命名它提取的目录文件时,我收到以下错误

Warning: rename(.,Manga/Naruto/Hell/.) [function.rename]: Permission denied in C:\public_html\mangaUpload.php on line 124

Warning: rename(..,Manga/Naruto/Hell/..) [function.rename]: Permission denied in C:\public_html\mangaUpload.php on line 124 

尽管我已经选择了所有正在使用的文件夹,但这里是代码

if(!file_exists("Manga"))
    
      mkdir("Manga",0777);
      chmod("Manga",0777);
    

    if(!file_exists("Manga/".$_POST['mangaName']))
    
      mkdir("Manga/".$_POST['mangaName'],0777);
      chmod("Manga/".$_POST['mangaName'],0777);
    
    if(!file_exists("Manga/".$_POST['mangaName']."/".$_POST['chapterName']))
    
      mkdir("Manga/".$_POST['mangaName']."/".$_POST['chapterName'],0777);
      chmod("Manga/".$_POST['mangaName']."/".$_POST['chapterName'],0777);
    

        $pathname = "Manga/".$_POST['mangaName']."/".$_POST['chapterName']."/";
        $chapterZip = new ZipArchive();


        if ($chapterZip->open($_FILES['chapterUpload']['tmp_name']) === true)  

            for($i = 0; $i < $chapterZip->numFiles; $i++) 



      $chapterZip->extractTo($pathname, array($chapterZip->getNameIndex($i))); 
        chmod($pathname.$chapterZip->getNameIndex($i),0777);

        list($width, $height) = getimagesize($pathname.$chapterZip->getNameIndex($i));

            $imageLocation= "INSERT INTO imageLocation (imageLocation,imageWidth,imageHeight,chapterID) VALUES  ('"."Manga/".$_POST['mangaName']."/".$_POST['chapterName']."/".$chapterZip->getNameIndex($i).
            "',".$width.",".$height.",".$chapterID.")";
            getQuery($imageLocation,$l);                  
        

       $chapterZip->close();
           $directories = glob($pathname.'*', GLOB_ONLYDIR);

       if ($directories !== FALSE) 

      foreach($directories as $directory) 

        $dir_handle = opendir($directory);
        while(($filename = readdir($dir_handle)) !== FALSE) 

          // Move all subdirectory contents to "Chapter Folder"
          if (rename($filename, $pathname.basename($filename)) === FALSE) 
           $errmsg0.= "Error moving file ($filename) \n";
                
                else 
                $errmsg0.="You have successfully uploaded a manga chapter";
                
          
        
      
                    

【问题讨论】:

【参考方案1】:

哈哈,这不是权限问题 :) 解决方法:

while(($filename = readdir($dir_handle)) !== FALSE) 
  if ($filename[0] == ".") continue;

考虑使用现代的glob() 而不是古老的opendir。

【讨论】:

DirectoryIterator 类可能更像是一个替代品。php.net/manual/en/class.directoryiterator.php【参考方案2】:

rename 循环中排除...,因为它们是分别引用当前文件夹和父文件夹的别名(请记住为什么要使用cd .. 转到父文件夹):

   while(($filename = readdir($dir_handle)) !== FALSE) 
      if ($filename != '.' && $filename != '..') 
         // Move all subdirectory contents to "Chapter Folder"
         if (rename($filename, $pathname.basename($filename)) === FALSE) 
           $errmsg0.= "Error moving file ($filename) \n";
            
            else 
            $errmsg0.="You have successfully uploaded a manga chapter";
            
         
      
    

【讨论】:

以上是关于重命名文件权限的主要内容,如果未能解决你的问题,请参考以下文章

linux基础问题 创建目录 拷贝 重命名 设置权限

尝试在只写目录中创建/删除/重命名文件时权限被拒绝

Win10不能重命名文件夹,老提示找不到指定路径怎么办?

linux下的TMP目录需要改成啥权限才能重命名里面的文件啊?

Mac OS 根本没有 usr/bin 文件夹的权限

NGINX - 从上游读取时拒绝重命名权限