假设我们有以下树列表:
www _
\_sources_
\ \_dir1
\ \_dir2
\ \_file
\_cache
我正在尝试以递归方式解析“sources”中的每个文件并将其复制到“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)) ) )
答案 0 :(得分: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没有任何影响对此。
首先让我们创建一个文件:
squale@shark: ~/developpement/tests/temp/plop
$ echo "file" > a.txt
squale@shark: ~/developpement/tests/temp/plop
$ ls
a.txt
现在,我尝试创建一个名为a.txt
的目录:
squale@shark: ~/developpement/tests/temp/plop
$ mkdir a.txt
mkdir: impossible de créer le répertoire «a.txt»: Le fichier existe
错误消息(抱歉,我的系统是法语)说“无法创建目录a.txt:文件已存在”
那么,您确定可以创建一个与现有文件同名的目录吗?