2016-07-19 189 views
0

我有一個PHP腳本,其中包括大致線:PHP的mkdir()失敗,但失敗命令rmdir因爲它沒有

$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 

+2

因爲:'$'DIR是不是'$ dirname','$ dirname'甚至不作爲變量存在於你的代碼refrence –

+0

@ArshSingh啊哈哈哈哈多數民衆贊成讓我精神大振。發現得好。 – Martin

+0

@ArshSingh對不起,這只是我的問題,而不是我的實際代碼錯字!變量確實匹配。 –

回答

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 
      } 
     }