PHP mkdir()失败,因为文件存在,但rmdir失败,因为它没有

时间:2016-07-19 09:00:46

标签: php shell file unix

我有一个PHP脚本,其中包含大致的行:

$dirname = '/directory/subdirectory';

if ( mkdir($dirname) ) {
   // do something...
} else {
   // couldn't make the directory, error out
}

哪个返回错误。 error_get_last()返回:

Array
(
    [type] => 2
    [message] => mkdir(): File exists
    [file] => /scripts/the_script.php
    [line] => 155
)

但是,我的文件系统(在GUI或命令行中)似乎不存在该目录,rmdir /directory/subdirectory因“没有这样的文件或目录”而失败。

帮助!

编辑:对于那些追随者 - 为了清楚起见,我已经删除了之前关于文件名冲突的独立解析后的编辑/更新。上述问题仍然存在。

编辑II
权限:没有权限问题我非常有信心。我可以使用完全相同的代码在同一目录中创建一个不同名称的子目录而不会出现问题。似乎更多的情况是,当系统另有说法时,PHP认为存在某个子目录。

这一切都在virtualbox centos机器上运行,共享目录安装在我的主机上。该目录不会出现在计算机的shell实例中或ssh上。

编辑III
为了确认人们可能在想什么,看起来这个问题实际上与PHP无关。在命令行中,我可以运行:

$ mkdir /path/to/directory
mkdir: cannot create directory '/path/to/directory': File exists
$ rmdir /path/to/directory
rmdir: failed to remove '/path/to/directory': No such file or directory

最重要的是......

$ rm /path/to/directory
rm: cannot remove '/path/to/directory': Is a directory

什么

1 个答案:

答案 0 :(得分:0)

也许您想首先检查目录是否存在,然后再创建它。其次,您应确保在要创建新目录的目录中具有相应的权限(要创建的新目录的父目录),否则,您可能会遇到权限问题。下面的代码说明了这个想法:

    <?php
        $dirName        = __DIR__  . "/directory/subdirectory";
        $dirOK          = false;

        if(!file_exists($dirName)){
            // SPLIT THE DIRECTORY NAME AT "/" INTO AN ARRAY,
            // IN AN ATTEMPT TO EXTRACT THE PARENT DIRECTORY
            $dirParts   = preg_split("\/", $dirName);

            // REMOVE THE LAST ELEMENT OF THE ARRAY TO GET THE PARENT DIRECTORY
            $subDir     = array_pop($dirParts);

            // BUILD UP THE PARENT DIRECTORY WITH IMPLODE
            $parentDir  = implode("/", $dirParts);

            // SET THE APPROPRIATE PERMISSION ON THE PARENT DIRECTORY
            // BEFORE ATTEMPTING TO CREATE A SUB-DIRECTORY INSIDE IT
            if( is_dir($parentDir) ){
                chmod($parentDir, 0777);

                // NOW, HAVING THE APPROPRIATE PERMISSION; CREATE THE SUB-DIRECTORY
                $dirOK  = mkdir($dirName . "/{$subDir}", 0777);
            }

            if($dirOK){
                // DIRECTORY WAS SUCCESSFULLY CREATED,
                // DO SOMETHING HERE IF NECESSARY
            }else{
                // DIRECTORY COULD NOT BE CREATED,
                // DO SOMETHING HERE IF NECESSARY
            }
        }