2011-03-31 118 views
0

假設我們有以下的樹形列表:MKDIR創建一個文件,而不是目錄

www _ 
    \_sources_ 
     \  \_dir1 
     \  \_dir2 
     \  \_file 
     \_cache 

我試圖遞歸解析每個文件中的「來源」,並複製到「緩存」文件夾中保存的層次,但在我的函數mkdir()創建一個文件,而不是目錄。 函數之外,mkdir()可以正常工作。這裏是我的功能:

function extract_contents ($path) { 
    $handle = opendir($path); 
    while (false !== ($file = readdir($handle))) { 
    if ($file !== ".." && $file !== ".") { 
     $source_file = $path."/".$file; 
     $cached_file = "cache/".$source_file; 
     if (!file_exists($cached_file) || (is_file($source_file) && (filemtime($source_file) > filemtime($cached_file)))) { 
      file_put_contents($cached_file, preg_replace('/<[^>]+>/','',file_get_contents($source_file))); } 
     if (is_dir($source_file)) { 
# Tried to save umask to set permissions directly – no effect 
#   $old_umask = umask(0); 
      mkdir($cached_file/*,0777*/); 
      if (!is_dir($cached_file)) { 
       echo "S = ".$source_file."<br/>"."C = ".$cached_file."<br/>"."Cannot create a directory within cache folder.<br/><br/>"; 
       exit; 
       } 
# Setting umask back 
#   umask($old_umask); 
      extract_contents ($source_file); 
      }    
     } 
    } 
    closedir($handle); 
} 
extract_contents("sources"); 

PHP調試給我什麼,但
[phpBB Debug] PHP Notice: in file /var/srv/shalala-tralala.com/www/script.php on line 88: mkdir() [function.mkdir]: ???? ?????????? 有其含有的mkdir()沒有其他線路。

ls -l cache/sources看起來像
-rw-r--r-- 1 apache apache 8 Mar 31 08:46 file
-rw-r--r-- 1 apache apache 0 Mar 31 08:46 dir1
很明顯,那的mkdir()創建一個目錄,但它不設置 「d」 標誌吧。我只是不明白,爲什麼。所以在第一次,有人可以幫助並告訴我,如何通過chmod()通過八進制權限設置該標誌,而我沒有看到任何更好的解決方案? (我已經看到man 2 chmodman 2 mkdir,沒有什麼關於 「d」 標誌)

另外:
由changind解決的第二個,如果條件
if ((!file_exists($cached_file) && is_file($source_file)) || (is_file($source_file) && (filemtime($source_file) > filemtime($cached_file))))

回答

4

您使用此:

file_put_contents($cached_file, preg_replace('/<[^>]+>/','',file_get_contents($source_file))); } 

其中創建一個名爲$cached_file文件。


,然後,調用一個:

mkdir($cached_file/*,0777*/); 

在那裏,你嘗試創建一個名爲$cached_file目錄。

但是已經存在一個具有該名稱的現有文件。
這意味着:

  • mkdir失敗,因爲不存在與該名稱
  • 一個文件,你有一個文件,你先前與file_put_contents創建的。



評論後編輯:只是作爲一個測試,我會嘗試創建一個文件,並且具有相同名稱的目錄 - 使用命令行,而不是從PHP ,以確保PHP對此沒有任何影響。

首先,讓我們創建一個文件:

[email protected]: ~/developpement/tests/temp/plop 
$ echo "file" > a.txt 
[email protected]: ~/developpement/tests/temp/plop 
$ ls 
a.txt 

而且,現在,我嘗試用相同的名字a.txt創建一個目錄:

[email protected]: ~/developpement/tests/temp/plop 
$ mkdir a.txt 
mkdir: impossible de créer le répertoire «a.txt»: Le fichier existe 

錯誤消息(對不起,我的系統是在法文)「無法創建目錄a.txt:文件已存在」

那麼,你確定你可以創建一個與現有文件同名的目錄嗎?

+0

當mkdir失敗時,它不會創建任何內容。但它會創建一個文件。在相同的目錄中有一個文件和一個名稱相同的文件夾沒有問題。另外,該腳本現在停止在目錄上,該目錄在其自身附近沒有具有相同名稱的文件。正如我上面寫的,我試圖在函數外創建一個具有相同名稱的目錄,並且它可以工作。但它沒有顯示,但我是一個白癡。 – tijagi 2011-03-31 05:51:46

+0

對不起,你當然是對的。不能有一個文件和一個同名的目錄。我只有像「abc.def」這樣的文件和對應於它們的文件夾「abc」,這些文件都可以工作。看起來,你也是對的,這是file_put_contents生成一個以前的mkdir文件試圖做到這一點。通過增加一個條件,它現在可以正常工作。謝謝! – tijagi 2011-03-31 06:50:09

+0

不客氣:-)玩得開心! – 2011-03-31 07:06:04

相關問題