переименовать папку в подпапку с помощью PHP - PullRequest
11 голосов
/ 16 апреля 2010

Я пытаюсь переместить папку, переименовав ее. Папки test1 и test2 уже существуют.

rename(
 "test1",
 "test2/xxx1/xxx2"
);

Я получаю ошибку: переименовать (...): нет такого файла или каталога

Я предполагаю, что это потому, что каталог "xxx1" не существует. Как я могу переместить каталог test1?

Ответы [ 4 ]

16 голосов
/ 16 апреля 2010

Вам может потребоваться создать каталог, в который он входит, например,

$toName = "test2/xxx1/xxx2";

if (!is_dir(dirname($toName))) {
    mkdir(dirname($toName), 0777, true);
}

rename("test1", $toName);

Третий параметр mkdir() является 'рекурсивным', что означает, что вы можете создавать вложенные каталоги одним вызовом.

2 голосов
/ 16 апреля 2010

Почему бы не убедиться, что все родительские каталоги существуют первыми, создав их? mkdir - использовать рекурсивный параметр.

1 голос
/ 09 марта 2017

Ваше предположение было верным, потому что в вашем примере "xxx1" не существует.

Итак, перед rename("oldname", "/some/long/nested/path/test2/xxx1/newname") необходимо создать древовидную структуру каталогов: /some/long/nested/path/test2/xxx1/, но newname файл (или каталог) не должен существовать в момент вызова функции rename.

Для обобщения решения взгляните на следующую наивную функцию:

function renameWithNestedMkdir($oldname , $newname)
{
     $targetDir = dirname($newname); // Returns a parent directory's path (operates naively on the input string, and is not aware of the actual filesystem)

    // here $targetDir is "/some/long/nested/path/test2/xxx1"
    if (!file_exists($targetDir)) {
        mkdir($targetDir, 0777, true); // third parameter "true" allows the creation of nested directories
    }

    return rename($oldname , $newname);
}

// example call
renameWithNestedMkdir("oldname", "/some/long/nested/path/test2/xxx1/newname");

// another example call
renameWithNestedMkdir("test1", "test2/xxx1/xxx2");

Я назвал эту реализацию "наивной", потому что в реальном производстве вам также следует подумать о том, как справиться с некоторыми крайними случаями: что, если $ newname уже существует? Что если /some/long/nested/path/test2/xxx1 уже существует, но это файл (не каталог)? Почему я ставлю 0777 права доступа при mkdir? Что делать, если Mkdir не удалось?

0 голосов
/ 16 апреля 2010

Я думаю, что test2 / xxx1 должен существовать, поэтому вам нужно использовать mkdir, прежде чем перемещать его.

...