при перемещении одного файла из одного места в другое я использую
rename('path/filename', 'newpath/filename');
как вы перемещаете все файлы в папку в другую папку? попробовал это безрезультатно:
rename('path/*', 'newpath/*');
Немного подробное решение:
// Get array of all source files $files = scandir("source"); // Identify directories $source = "source/"; $destination = "destination/"; // Cycle through all source files foreach ($files as $file) { if (in_array($file, array(".",".."))) continue; // If we copied this successfully, mark it for deletion if (copy($source.$file, $destination.$file)) { $delete[] = $source.$file; } } // Delete all successfully-copied files foreach ($delete as $file) { unlink($file); }
Альтернативный с помощью rename () и с некоторой проверкой ошибок:
$srcDir = 'dir1'; $destDir = 'dir2'; if (file_exists($destDir)) { if (is_dir($destDir)) { if (is_writable($destDir)) { if ($handle = opendir($srcDir)) { while (false !== ($file = readdir($handle))) { if (is_file($srcDir . '/' . $file)) { rename($srcDir . '/' . $file, $destDir . '/' . $file); } } closedir($handle); } else { echo "$srcDir could not be opened.\n"; } } else { echo "$destDir is not writable!\n"; } } else { echo "$destDir is not a directory!\n"; } } else { echo "$destDir does not exist\n"; }
Попробуйте это решение, оно успешно протестировано ::
<?php $files = scandir("f1"); $oldfolder = "f1/"; $newfolder = "f2/"; foreach($files as $fname) { if($fname != '.' && $fname != '..') { rename($oldfolder.$fname, $newfolder.$fname); } } ?>
Поэтому я попытался использовать функцию rename()
как описано, и я все время возвращал ошибку, что no such file or directory
. Я поместил код в оператор if else, чтобы убедиться, что у меня действительно созданы созданные каталоги. Это выглядело так:
$tempDir = '/home/site/images/tmp/'; $permanentDir = '/home/site/images/' . $claimid; // this was stored above mkdir($permanentDir,0775); if(is_dir($permanentDir)){ echo $permanentDir . ' is a directory'; if(is_dir($tempDir)){ echo $tempDir . ' is a directory'; }else{ echo $tempDir . ' is not a directory'; } }else{ echo $permanentDir . ' is not a directory'; } rename($tempDir . "*", $permanentDir);
Поэтому, когда я снова запустил код, он выплюнул, что оба пути – это каталоги. Я был в тупике. Я поговорил с коллегой, и он предложил: «Почему бы просто не переименовать каталог temp в новый каталог, так как вы все равно хотите переместить все файлы?»
Оказывается, это то, что я закончил делать. Я отказался от использования шаблона с функцией rename()
и вместо этого просто использовал rename()
чтобы переименовать временную директорию в постоянную.
поэтому он выглядит так.
$tempDir = '/home/site/images/tmp/'; $permanentDir = '/home/site/images/' . $claimid; // this was stored above mkdir($permanentDir,0775); rename($tempDir, $permanentDir);
Это прекрасно работало для моих целей, так как мне не нужен старый tmp-каталог, чтобы он оставался там после того, как файлы были загружены и «перемещены».
Надеюсь это поможет. Если кто-нибудь знает, почему подстановочный знак не работает в функции rename()
и почему я получаю сообщение об ошибке выше, пожалуйста, дайте мне знать.
попробовал один:
<?php $oldfolderpath = "old/folder"; $newfolderpath = "new/folder"; rename($oldfolderpath,$newfolderpath); ?>
попробуйте это: rename ('путь / *', 'newpath /');
Я не вижу смысла иметь звездочку в пункте назначения
Если целевой каталог не существует, его необходимо создать сначала:
mkdir('newpath'); rename('path/*', 'newpath/');
Как примечание; при копировании файлов в другую папку их последнее измененное время становится текущей временной меткой. Поэтому вы должны касаться () новых файлов.
... (some codes for directory looping) ... if (copy($source.$file, $destination.$file)) { $delete[] = $source.$file; $filetimestamp = filemtime($source.$file); touch($destination.$file,$filetimestamp); } ... (some codes) ...
Не уверен, что это помогает кому-то или нет, но я думал, что все равно отправлю. Был вызов, когда у меня было множество фильмов, которые я купил и загрузил через различные интернет-магазины, все хранящиеся в одной папке, но все в их собственных подпапках и все с различными соглашениями об именах. Я хотел переместить все их в родительскую папку и переименовать их все, чтобы выглядеть красиво. все подпапки, которые мне удалось переименовать, с помощью инструмента массового переименования и форматирования условных имен. вложенные папки имели другие файлы, в которые я не хотел. поэтому я написал следующий php-скрипт: 1. переименуйте / переместите все файлы с расширением mp4 в их родительский каталог, указав им то же имя, что и их содержащая папка, 2. удалите содержимое вложенных папок и найдите каталоги внутри них для пустых, а затем rmdir, 3. rmdir подпапки.
$handle = opendir("D:/Movies/"); while ($file = readdir($handle)) { if ($file != "." && $file != ".." && is_dir($file)) { $newhandle = opendir("D:/Movies/".$file); while($newfile = readdir($newhandle)) { if ($newfile != "." && $newfile != ".." && is_file("D:/Movies/".$file."/".$newfile)) { $parts = explode(".",$newfile); if (end($parts) == "mp4") { if (!file_exists("D:/Movies/".$file.".mp4")) { rename("D:/Movies/".$file."/".$newfile,"D:/Movies/".$file.".mp4"); } else { unlink("D:/Movies/".$file."/".$newfile); } } else { unlink("D:/Movies/".$file."/".$newfile); } } else if ($newfile != "." && $newfile != ".." && is_dir("D:/Movies/".$file."/".$newfile)) { $dirhandle = opendir("D:/Movies/".$file."/".$newfile); while ($dirfile = readdir($dirhandle)){ if ($dirfile != "." && $dirfile != ".."){ unlink("D:/Movies/".$file."/".$newfile."/".$dirfile); } } rmdir("D:/Movies/".$file."/".$newfile); } } unlink("D:/Movies/".$file); } }