Как переименовать файл php
rename
(PHP 4, PHP 5, PHP 7, PHP 8)
rename — Переименовывает файл или директорию
Описание
Список параметров
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Примеры
Пример #1 Пример использования функции rename()
Смотрите также
User Contributed Notes 26 notes
Code first, then explanation.
?>
That doesn’t rename the file within the folder, as you might assume, instead, it moves the file to whatever the PHP working directory is. Chances are you’ll not find it in your FTP tree. Instead, use the following:
From the Changelog notes:
“Warnings may be generated if the destination filesystem doesn’t permit chown() or chmod() system calls to be made on files — for example, if the destination filesystem is a FAT filesystem.”
More explicitly, rename() may still return (bool) true, despite the warnings that result from the underlying calls to chown() or chmod(). This behavior can be misleading absent a deeper understanding of the underlying mechanics. To rename across filesystems, PHP “fakes it” by calling copy(), unlink(), chown(), and chmod() (not necessarily in that order). See PHP bug #50676 for more information.
On UNIX-like operating systems, filesystems may be mounted with an explicit uid and/or gid (for example, with mount options “uid=someuser,gid=somegroup”). Attempting to call rename() with such a destination filesystem will cause an “Operation not permitted” warning, even though the file is indeed renamed and rename() returns (bool) true.
This is not a bug. Either handle the warning as is appropriate to your use-case, or call copy() and then unlink(), which will avoid the doomed calls to chown() and chmod(), thereby eliminating the warning.
For those who are still confused about the behavior of rename() in Linux and Windows (Windows XP) when target destination exists:
Actually, I’m pretty sure that rename follows the convention of *nix rename(2) in overwriting the destination if it exists atomically (meaning that no other process will see the destination cease to exist, even for an instant). This is useful because it allows you to build a file as a temp file, then rename it to where you want it to be, and nobody sees the file when it’s half done.
– rename extension of files
parameter 1 : the directory name
parameter 2 : the first extention wich we want to replace
parameter 3 : the new extention of files
for a simple usage call the function :
changeext(‘dir’, ‘html’, ‘php’, ‘false’);
to change evry file name with extention html into php in the directory dir
Note, that on Unix, a rename is a beautiful way of getting atomic updates to files.
Just copy the old contents (if necessary), and write the new contents into a new file, then rename over the original file.
Any processes reading from the file will continue to do so, any processes trying to open the file while you’re writing to it will get the old file (because you’ll be writing to a temp file), and there is no “intermediate” time between there being a file, and there not being a file (or there being half a file).
Oh, and this only works if you have the temp file and the destination file on the same filesystem (eg. partition/hard-disk).
If by any chance you end up with something equivalent to this:
rename() is working on Linux/UNIX but not working on Windows on a directory containing a file formerly opened within the same script. The problem persists even after properly closing the file and flushing the buffer.
Inserting a sleep() command before the renaming cures the problem.
You will get two warnings:
“PHP Warning: rename(): The first argument to copy() function cannot be a directory in on line “
“PHP Warning: rename(t2,/var/run/test/t2): Invalid cross-device link in on line “
The copy() mentioned I assume is C’s copy() and not PHP’s copy() function. There is an associated bug in the Ubuntu bug system for this as well, that was escalated to bugs.php.net:
https://bugs.php.net/bug.php?id=54097
rename() fails with PHP4 and PHP5 under Windows if the destination file exists, regardless of file permission settings. I now use a function similar to that of ddoyle [at] canadalawbook [dot] ca, which first tries rename(), checks if it returned FALSE and then uses copy()/unlink() if it failed.
However, copy() is, unlike rename(), NOT useable for “atomic updates”. Another process may actually access the destination file while copy() is working. In such a case, the other process with perceive the file as empty or with incomplete content (“half written”).
Note that this WILL NOT WORK if trying to rename a directory to a network share.
e.g.
rename(‘/home/user/me/dir1’, ‘/mnt/shares/nfsmount/dir2’)
will create a file called ‘dir2’ on the share and not a directory.
This caught me out and my (quickest) solution was to use an exec and mv command:
Работа с файлами в PHP
Чтение файла: file_get_contents()
С помощью функции file_get_contents() можно получить содержимое файла:
Также мы можем получить html-код какой-либо страницы в интернете:
Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.
Чтение файла: file()
Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.
Создадим в корне сайта файл data.txt со следующим содержимым:
Теперь запустим скрипт index.php со следующим кодом:
При запуске этого скрипта мы получим в браузере:
Заметили, что у первых двух строк длина 7 символов вместо пяти? Это из-за того, что каждая строка содержит в конце символы переноса строки.
Чаще всего они нам не нужны, поэтому их можно убрать, передав вторым параметром константу FILE_IGNORE_NEW_LINES :
Теперь у всех строк будет по 5 символов.
Если нам необходимо получить только заполненные строки в файле и пропустить пустые, можно передать вторым параметром константу FILE_SKIP_EMPTY_LINES :
Разумеется, мы можем передать сразу две константы:
Создание файла и запись в файл: file_put_contents()
Функция file_put_contents() позволяет создать файл и заполнить его данными.
Чтобы не перезаписывать данные, а добавить их в конец файла, нужно передать третьим параметром константу FILE_APPEND :
Также вторым параметром можно передать массив:
Но этот вариант не очень удобен, поскольку все элементы массива запишутся подряд, без каких-либо разделителей. Чтобы их добавить, можно использовать функцию implode:
Создание папки или структуры папок
Создать папку можно с помощью функции mkdir() (make directory):
Кроме этого, второй параметр может игнорироваться при заданной umask (пользовательская маска (user mask), которая нужна для определения конечных прав доступа). В этом случае принудительно сменить права можно функцией chmod() :
Также мы можем создать структуру папок рекурсивно, для этого нужно третьим параметром передать true :
Но в этом случае права доступа будут заданы только для конечной папки. Для изменения прав у каждой из папок придётся указывать права вручную:
Проверка существования файла или папки
Проверить существование папки или файла можно с помощью функции file_exists() :
Если вы хотите проверить существование только папки или только файла, для этого есть специальные функции is_dir() и is_file() :
Проверка прав доступа
Функции is_readable() и is_writable() проверяют, есть ли у пользователя, от имени которого запущен PHP, права на чтение и запись файла или папки:
Копирование, перенос и удаление файла
Для удаления файлов используется функция unlink() :
Чтобы скопировать файл, используем функцию copy() :
Для переименования и переноса файла в другую папку используется функция rename() :
Работа с файлами с помощью fopen()
Но иногда возникают ситуации, когда нам необходимы более продвинутые инструменты. Например, если у нас есть большой текстовый файл и мы хотим читать его построчно, а не весь сразу, для экономии оперативной памяти.
Итак, открыть (или создать и открыть) файл можно с помощью функции fopen() :
Для построчного чтения файла используется функция fgets() :
Также в PHP существует множество других полезных функций, работающих с дескриптором файла. Почитать о них можно в документации.
Как переименовать файлы. Скрипт на php
За счет php языка программирования можно решать множество полезных задач не только для веб программ и сайтов, но даже и в прикладном делопроизводстве. Представьте, что у вас есть более сотни файлов, которые нужно автоматом переименовать и привести к общему виду.
Вручную можно произвести такую не благодарную операцию, но это займет много времени. Проще использовать денвер или вебсервер, куда можно загрузить все файлы, а затем запустить скрипт, который все сделает сам. Очень часто это нужно, когда заказчик передает вам сотни изображений, которые имеют кириллические имена. А ваш сайт поддерживает только латинские символы. В этом и поможет скрипт описанный ниже:
Скрипт переименования файлов на php
Не смотря на то, что данный скрипт достаточно простой, он очень эффективен. Более того у него есть фильтрация по типам переименовываемых файлов. Но обо всем по порядку.
Чтобы скрипт работал создайте 2 папки, например в корне вашего денвера: original (в нее нужно загружать файлы, которые надо переименовать) и rename (здесь будут переименованные файлы-копии), а также файл index.php (обязательно в кодировке UTF-8 без BOM) с содержимым описанным выше.
Фильтрация по расширениям файлов выполняется за счет glob() функции. Сейчас внутри нее прописаны те расширения, которые должна искать программа. Естественно, вы можете задать свои, например: doc, docx, csv и т.д.
Вот таким несложным скриптом можно решать прикладные задачи по автоматическому переименованию множества файлов на php.
