Управление файлами
Как и любой другой универсальный язык программирования, РНР предоставляет полный набор средств для работы с файлами. С помощью языка РНР с информацией, хранящейся на компьютере, можно выполнять любые действия. Так, файлы можно создавать, копировать, удалять или выполнять их поиск. Язык РНР позволяет также запускать любые программы, пересылать файлы с одного компьютера на другой и передавать информацию по электронной почте. В этом разделе рассматриваются все те возможности языка РНР, которые позволяют ощутить реальную мощь современной вычислительной техники.
Информация, которая хранится на жестком диске, упорядочена в файлах (file). В свою очередь, для обеспечения их более эффективной обработки (например, для поиска) файлы распределены по каталогам (directory) или папкам (folder). Набор файлов и каталогов называется файловой системой (file system). Она имеет иерархическую структуру и содержит единственный корневой (root) каталог, такой как С:\ в операционной системе Windows или / — в Linux. В корневом каталоге содержатся другие каталоги, каждый из которых также содержит другие каталоги, и т.д. При этом количество вложенных каталогов может быть произвольным.
В общем случае каталог следует рассматривать как специальный файл, используемый для объединения других файлов. В каталоге содержится список файлов и информация, необходимая операционной системе для их поиска. Очевидно, что каталог может содержать как файлы, так и другие каталоги.
В языке РНР имеются функции, которые позволяют открывать файлы и считывать или записывать в них информацию. Файлы можно копировать, удалять, переименовывать, а также выполнять над ними много других действий. Именно такие функции и рассматриваются в следующих разделах. Кроме того, в этом разделе вы узнаете, как управлять каталогами и исследовать их содержимое.
В этом разделе рассматривается только часть функций для работы с файлами. Если над файлами или каталогами необходимо выполнить какие-либо действия, обратитесь к справочному руководству и посмотрите, не определена ли в языке РНР соответствующая функция. Если такая функция отсутствует, можно воспользоваться командами операционной системы или программой, написанной на другом языке. Все эти возможности более подробно рассматриваются ниже, в разделе "Использование команд операционной системы".
Получение информации о файлеЗачастую требуется получить какие-нибудь данные о файле. В языке РНР определены функции, которые в сценарии позволяют получить всю необходимую информацию. Для того чтобы узнать, существует ли файл, предназначена функция file_exists().
$result = file_exists("stuff.txt"); После вызова этой функции переменной $result присваивается либо значение TRUE, либо FALSE. Обычно функция file_exists() используется в условных операторах. Например:
if(!file_exists("stuff.txt")) { echo "Файл не найден!\n"; }
После того как вы убедитесь в существовании файла, можно приступать к сбору информации о нем. В таблице ниже приведены функции, позволяющие получить полезную информацию о файлах: Функция | Описание | Возвращаемое значение | is_file("stuff.txt") | Проверяет, является ли файл обычным файлом, или представляет собой каталог, или любой другой файл специального типа
| TRUE ИЛИ FALSE | is_dir("stuff.txt") | Проверяет, является ли файл каталогом | TRUE ИЛИ FALSE | is_executable("do.txt") | Проверяет, является ли файл исполняемым | TRUE ИЛИ FALSE | is_writable("stuff.txt") | Проверяет, можно ли записывать данные в файл
| TRUE ИЛИ FALSE | is_readable("stuff.txt") | Проверяет, можно ли из файла считывать данные
| TRUE ИЛИ FALSE | fileatime("stuff.txt") | Возвращает время последнего доступа к файлу
| Время в формате Unix (например, 10571961221 ИЛИ FALSE
| filectime("stuff.txt") | Возвращает время создания файла | Время в формате Unix или FALSE
| filemtime("stuff.txt") | Возвращает время последней модификации файла
| Время в формате Unix или FALSE
| filegroup("stuff.txt") | Возвращает присвоенный файлу идентификатор группы
| Целое число (идентификатор группы) ИЛИ FALSE
| fileowner("stuf f.txt") | Возвращает идентификатор владельца файла
| Целое число (идентификатор пользователя) или FALSE
| filesize("stuff.txt") | Возвращает размер файла в байтах | Целое число или FALSE | filetype("stuff.txt") | Возвращает тип файла | Тип файла (например, file, dir, link, char) или FALSE при вoзникнoвeнии ошибки или невозможности определения типа
| basename ("/11/do.txt" ) | Возвращает имя файла на основе указанного пути
| do.txt | dirname("/ti/do.txt") | Возвращает имя каталога, где размещается файл
| /t1 |
Часть информации можно получить лишь в операционных системах Linux/Unix/Mac, другую ее часть — и в системе Windows.
В языке РНР имеется полезная функция pathinfо(), которая позволяет получить путь и имя файла. Например:
$pinfo = pathinfо("/topdir/nextdir/stuff.txt"); После вызова этой функции в массиве $pinfо будет содержаться следующая информация: $pinfо[dirname] = /topdir/nextdir $pinfo[basename] = stuff.txt $pinfо[extension] = txt
При проверке файла с помощью функции вида is_нечто() любая ошибка при использовании аргумента, например опечатка в имени файла, приведет к возврату значения FALSE. Например, при вызове функции is_dir("tyme") будет получено значение FALSE, если tyme является файлом, а не каталогом. Это же значение будет возвращено, если файла tyme не существует.
Некоторые функции, приведенные в таблице, возвращают результат в формате времени Unix. Для преобразования его к стандартному виду даты следует воспользоваться функцией date().
Копирование, переименование и удаление файловВ предыдущем разделе рассматривались вопросы создания файлов и записи информации в них. В данном разделе описываются другие возможности работы с файлами, в том числе копирование и удаление. РНР позволяет скопировать существующий файл в новый и получить два идентичных файла с разными именами. Копирование файлов особенно полезно при создании резервных архивов важной информации. Для этого в РНР используется функция сору().
сору("fileold.txt", "filenew.txt"); После выполнения этой функции файл fileold.txt скопируется в filenew.txt. Если же файл с именем filenew.txt уже существует, он будет перезаписан. Чтобы избежать этого, следует воспользоваться таким фрагментом кода:
if(!file_exists("filenew.txt")) { copy("fileold.txt" , "filenew.txt"); } else { echo "Файл уже существует!\n"; }
Для переименования файла предназначена функция rename(): rename("oldname.txt", "newname.txt"); Если попытаться присвоить файлу уже существующее имя, будет выведено предупреждающее сообщение и файл не будет переименован:
Warning: rename(fileold.txt, filenew.txt):File exists in c:\test.php on line 17
Для удаления ненужного файла можно воспользоваться функцией unlink(): unlink("badfile.txt"); После вызова этой функции файл badfile.txt будет удален. Однако следует заметить, что, если файл не существует, никакое сообщение об ошибке не отобразится. Поэтому следует быть внимательным при использовании этой функции.
Организация файловКак уже отмечалось, файлы размещаются в каталогах (directory), которые также называют папками (folder). В этом разделе рассматриваются функции, позволяющие создавать и удалять каталоги, а также получать списки находящихся в них файлов.
Создание каталогаДля создания каталога в языке РНР используется функция mkdir(): mkdir("testdir"); После вызова этой функции будет создан новый каталог с именем testdir в той же папке, где находится и основной сценарий РНР. Например, если сценарий расположен по адресу /test/test.php, то новый каталог будет помещен в папку /test/testdir. Если попытаться создать каталог с уже существующим именем, будет выведено предупреждающее сообщение следующего вида:
Warning: mkdir() : File exists in d:/test/test.php on line 5 Для проверки существования каталога с определенным именем можно воспользоваться функцией is_dir(). Рассмотрим следующий фрагмент кода:
i f (!is_dir("mynewdir")) { mkdir("mynewdir"); } else { echo "Каталог уже существует! "; }
После создания каталога с его содержимым можно выполнять любые действия. Например, можно скопировать или удалить файлы (см. раздел "Копирование, переименование и удаление файлов").
Для создания каталога в другом месте следует задать полный путь к нему. Например: mkdir("/topdir/nextdir/mynewdir"); В функции mkdir() можно также использовать относительный путь к каталогу, как в следующем примере.
mkdir("../mynewdir"); Если сценарий находится в каталоге /topdir/test/makedir.php, то в результате выполнения этой команды новый каталог будет размещен по адресу /topdir/mynewdir. Для изменения имени каталога в РНР предусмотрена функция следующего вида:
chdir("../anotherdir");
Получение списка файлов каталогаОчень часто необходимо знать содержимое каталогов. Например, нужно вывести пользователю список предлагаемых для загрузки файлов или извлечь изображения из каталога, чтобы отобразить их в окне браузера.
РНР предоставляет набор разнообразных функций для открытия и чтения каталогов. Рассмотрим следующую строку кода:
$dh = opendir("/topdir/testdir"); Функция opendir() позволяет открыть каталог и, таким образом, получить к нему доступ. Если же попытаться обратиться к несуществующему каталогу, будет выведено следующее предупреждающее сообщение:
Warning: opendir(testdir): failed to open dir: Invalid argument in test13.php on line 5
В строке, содержащей вызов функции opendir(), переменная $dh используется в качестве дескриптора каталога (directory handle). Он является своеобразным указателем, который впоследствии можно использовать для обращения к файлам этого каталога. Для считывания имени файла из данного каталога в РНР предназначена функция readdir():
$filename = readdir($dh); После ее вызова в переменной $filename будет содержаться имя файла, но не полный путь к нему. Чтобы считать все файлы каталога, можно воспользоваться циклом while. Например:
while($filename = readdir($dh)) { echo $filename. "\n"; }
Следует также отметить, что при использовании функции readdir() порядок считывания файлов может быть произвольным.
Предположим теперь, что на Web-странице необходимо создать "картинную галерею", в которой будут содержаться изображения из определенного каталога. Для этого можно воспользоваться функциями opendir() и readdir(). В листинге А приведен сценарий, который позволяет это осуществить.
Листинг А. Сценарий, создающий "картинную галерею" ‹?php /*Имя сценария: displayGallery *Описание: отображает все картинки, хранящиеся в * определенном каталоге. */ echo "<html><head><title>Гaлepeя изображений</title></head> <body>"; $dir = "../test1/testdir/"; #8 $dh = opendir($dir); #9 while($filename = readdir($dh)) #10 { $filepath = $dir.$filename; #12 if(is_file($filepath)and ereg("\.jpg$",$filename)) #13 { $gallery[] == $filepath; } } sort($gallery); #16 foreach($gallery as $image) #17 { echo "<hr>"; echo "<img src='$image'><br>"; } ?› </body></html>
|
Обратите внимание на наличие номеров в конце некоторых строк. Рассмотрим код этих строк более подробно.
- Строка 8. Переменной $dir присваивается значение пути, которое будет впоследствии использоваться в сценарии. Обратите внимание на наличие косой черты (/) в конце строки, а также на использование этого символа вместо обратной косой (\) (даже в операционной системе Windows).
- Строка 9. В этой строке происходит открытие каталога.
- Строка 10. Начинается цикл while, считывающий все файлы из каталога.
- Строка 12. Создается переменная $filepath, значение которой соответствует полному пути к файлу. Если в строке 8 не включить символ /, переменная $filepath будет содержать ошибочное значение.
- Строка 13. В этой строке проверяется, является ли файл графическим, не имеет ли он расширение .jpg. Если это так, полный путь к изображению добавляется в массив с именем $gallery.
- Строка 16. В этой строке осуществляется сортировка значений массива $gallery в алфавитном порядке.
- Строка 17. С помощью цикла foreach изображения выводятся на Web-страницу.
|