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

Php mkdir创建一个文件而不是目录,php,file,directory,mkdir,Php,File,Directory,Mkdir,假设我们有以下树列表: www _ \_sources_ \ \_dir1 \ \_dir2 \ \_file \_cache 我试图递归地解析“sources”中的每个文件,并将其复制到保存层次结构的“cache”文件夹中,但在我的函数mkdir()中创建了一个文件而不是目录。在函数外部,mkdir()可以正常工作。以下是我的功能: function extract_content

假设我们有以下树列表:

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");
函数提取内容($path){
$handle=opendir($path);
while(false!=($file=readdir($handle))){
如果($file!==”。&&&&$file!=>){
$source_file=$path.“/”$file;
$cached_file=“cache/”$source_文件;
如果(!file_exists($cached_file)|;(is_file($source_file)&&(filemtime($source_file)>filemtime($cached_file))){
文件内容($cached_file,preg_replace('/]+>/','',file_get_contents($source_file));}
if(is_dir($source_file)){
#试图保存umask以直接设置权限–无效
#$old_umask=umask(0);
mkdir($cached_file/*,0777*/);
如果(!is_dir($cached_file)){
echo“S=“.$source_file.”
“C=“.$cached_file.”
“无法在缓存文件夹中创建目录。

”; 出口 } #将umask放回 #乌马斯克(old_umask); 提取内容($source\u文件); } } } closedir($handle); } 摘录内容(“来源”);
PHP调试只提供了
[phpBB Debug]PHP注意:在文件/var/srv/shalala-tralala.com/www/script.PHP的第88行:mkdir()[function.mkdir]:
没有其他行包含mkdir()

ls-l缓存/源
看起来像
-rw-r--r--1 apache 8 Mar 31 08:46文件

-rw-r--r--1 apache 0 Mar 31 08:46 dir1

很明显,mkdir()创建了一个目录,但它没有为它设置“d”标志。我就是不明白,为什么。所以,第一次,有人能帮助我,告诉我,如何通过chmod()通过八进制权限设置该标志,而我看不到更好的解决方案吗?(我已经看过了
man2 chmod
man2 mkdir
,没有关于“d”标志的内容)

添加:
通过将第二个if条件更改为
如果((!file_exists($cached_file)&&is_file($source_file))|(is_file($source_file)&&&&(filemtime($source_file)>filemtime($cached_file))
您正在使用此:

file_put_contents($cached_file, preg_replace('/<[^>]+>/','',file_get_contents($source_file)) ); }
在那里,您可以尝试创建一个名为
$cached\u file
的目录

但是已经有一个同名的现有文件。
这意味着:

  • mkdir
    失败,因为存在同名文件
  • 你有一个文件,就是你以前用
    文件内容
    创建的文件


注释后编辑:作为测试,我将尝试创建一个文件和一个同名目录——使用命令行,而不是从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:文件已经存在”

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

您使用的是:

file_put_contents($cached_file, preg_replace('/<[^>]+>/','',file_get_contents($source_file)) ); }
在那里,您可以尝试创建一个名为
$cached\u file
的目录

但是已经有一个同名的现有文件。
这意味着:

  • mkdir
    失败,因为存在同名文件
  • 你有一个文件,就是你以前用
    文件内容
    创建的文件


注释后编辑:作为测试,我将尝试创建一个文件和一个同名目录——使用命令行,而不是从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:文件已经存在”


因此,您确定可以创建与现有文件同名的目录吗?

当mkdir失败时,它不会创建任何内容。但它会创建一个文件。在同一目录中使用相同名称的文件和文件夹没有问题。此外,脚本现在停止在目录上,该目录附近没有同名文件。正如我在上面所写的,我尝试在函数外部创建一个同名的目录,它可以正常工作。但这并不能说明我是个白痴。对不起,你当然是对的。不能有同名的文件和目录。我只有像“abc.def”这样的文件和相应的文件夹“abc”,这很有效。看起来,你也是对的,这是一个文件,它的内容生成了一个文件,以前mkdir试图这样做。再添加一个条件,现在就可以正常工作了。谢谢当mkdir失败时,它不会创建任何内容。但它会创建一个文件。在同一目录中使用相同名称的文件和文件夹没有问题。此外,脚本现在停止在目录上,该目录附近没有同名文件。正如我在上面所写的,我尝试在函数外部创建一个同名的目录,它可以正常工作。但这并不能说明我是个白痴。对不起,你当然是对的。不能有同名的文件和目录。我只有像“abc.def”这样的文件和相应的文件夹“abc”,这很有效。看起来,你也是对的,这是一个文件,它的内容生成了一个文件,以前mkdir试图这样做。再添加一个条件,现在就可以正常工作了。谢谢