mkdir创建一个文件而不是目录

时间:2011-03-31 05:34:54

标签: php file directory mkdir

假设我们有以下树列表:

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 chmodman 2 mkdir,没有关于“d”标志的信息)

此外:
由changind解决了第二个条件 if ( (!file_exists($cached_file) && is_file($source_file)) || ( is_file($source_file) && (filemtime($source_file) > filemtime($cached_file)) ) )

1 个答案:

答案 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:文件已存在”

那么,您确定可以创建一个与现有文件同名的目录吗?