假設我們有以下的樹形列表: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 chmod
和man 2 mkdir
,沒有什麼關於 「d」 標誌)
另外:
由changind解決的第二個,如果條件
if ((!file_exists($cached_file) && is_file($source_file)) || (is_file($source_file) && (filemtime($source_file) > filemtime($cached_file))))
當mkdir失敗時,它不會創建任何內容。但它會創建一個文件。在相同的目錄中有一個文件和一個名稱相同的文件夾沒有問題。另外,該腳本現在停止在目錄上,該目錄在其自身附近沒有具有相同名稱的文件。正如我上面寫的,我試圖在函數外創建一個具有相同名稱的目錄,並且它可以工作。但它沒有顯示,但我是一個白癡。 – tijagi 2011-03-31 05:51:46
對不起,你當然是對的。不能有一個文件和一個同名的目錄。我只有像「abc.def」這樣的文件和對應於它們的文件夾「abc」,這些文件都可以工作。看起來,你也是對的,這是file_put_contents生成一個以前的mkdir文件試圖做到這一點。通過增加一個條件,它現在可以正常工作。謝謝! – tijagi 2011-03-31 06:50:09
不客氣:-)玩得開心! – 2011-03-31 07:06:04