mkdir создает файл вместо каталога - PullRequest
0 голосов
/ 31 марта 2011

Предположим, у нас есть следующий список деревьев:

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" ничего нет)

дополнение:
Решается изменением второго условия if на
if ( (!file_exists($cached_file) && is_file($source_file)) || ( is_file($source_file) && (filemtime($source_file) > filemtime($cached_file)) ) )

1 Ответ

4 голосов
/ 31 марта 2011

Вы используете это:

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:файл уже существует "

Итак, вы уверены, что можете создать каталог с тем же именем, что и существующий файл?

...