РНР Изучение языка
Работа с файлами
Для длительного хранения данных в файловой системе сервера часто используются обычные текстовые файлы. Открыть файл Прочитать данные из файла или записать данные в файл Закрыть файл
Открытие файлов в файловой системе сервера производится при помощи функции fopen: fopen(имя_файла, режим, каталог_по_умолчанию)
Первый аргумент - имя файла или абсолютный путь к нему. Если абсолютный путь не указывается, то файл должен находится в текущем каталоге.
Второй аргумент режим говорит о том, для каких действий открывается файл и может принимать следующие значения: r (Открыть файл только для чтения; после открытия указатель файла устанавливается в начало файла); r+ (Открыть файл для чтения и записи; после открытия указатель файла устанавливается в начало файла); w (Создать новый пустой файл только для записи; если файл с таким именем уже есть вся информация в нем уничтожается);
w+ (Создать новый пустой файл для чтения записи; если файл с таким именем уже есть вся информация в нем уничтожается); a (Открыть файл для дозаписи; данные будут записываться в конец файла); a+ (Открыть файл для дозаписи и чтения данных; данные будут записываться в конец файла); b (Флаг, указывающий на работу (чтение и запись) с двоичным файлом; указывается только в Windows).
Третий необязательный аргумент определяет должны ли искаться файлы в каталоге, установленном по умолчанию. (Каталог по умолчанию устанавливается в файле php.ini).
В случае удачного открытия файла, функция fopen возвращает дескриптор файла, в случае неудачи - false.
Дескриптор (идентификатор) файла представляет собой указатель на открытый файл, который используется операционной системой для поддержки операций с этим файлом.
Этот код открывает файл C:/WWW/HTML/file.txt для чтения: <? $file = fopen("c:/www/html/file.txt","r"); if(!$file) { echo("Ошибка открытия файла"); } ?>
Содержимое открытого файла можно отобразить в браузере с помощью функции fpassthru (дескриптор)
<? $file = fopen("c:/www/html/picture1.jpg","rb"); if(!$file) { echo("Ошибка открытия файла"); } else { fpassthru($file); } ?>
Еще одна функция отображения readfile (имя_файла) в качестве аргумента принимает имя файла, а не его дескриптор: <? readfile ("file.txt"); ?>
Закрытие файлов осуществляется с помощью функции fclose (дескриптор)
Прочитать строку из открытого файла можно с помощью функции fread (дескриптор, длина ) Эта функция возвращает строку заданной длины символов.
Пример (чтение из файла): <? $file = fopen("c:/www/html/file.txt","r"); if(!file) { echo("Ошибка открытия файла"); } else { $buff = fread ($file,100); print $buff; } ?>
Файл отсутствует в текущем каталоге
Файл file.txt
Для чтения из файла можно также пользоваться функцией fgets: fgets (дескриптор, длина) Эта функция читает и возвращает строку заданной длины минус 1 байт.
Чтение прекращается, когда достигнута новая строка или конец файла.
Для чтения файла с удалением из него тегов HTML применяется функция fgetss (дескриптор, длина [, допустимые_теги])
Необязательный параметр допустимые_теги может содержать строку со списком тегов (через запятую), которые не должны быть отброшены, при этом теги в строке записываются.
Для чтения содержимого файла в массив, применяется функция file (имя_файла) Каждый элемент массива соответствует строке в прочитанном файле.
Функция feof (дескриптор) возвращает true при достижении указателем конца файла, а в противном случае возвращается false.
Функция file() удобна также тем, что с ее помощью можно легко подсчитать количество строк в файле: <? $file_array = file ("file.txt"); if(!$file_array) { echo("Ошибка открытия файла"); } else { $num_str = count($file_array); echo($num_str); } ?>
Примечание. Функцию file следует применять лишь для чтения небольших файлов.
Для чтения файлов с расширением *.csv применяется функция fgetcsv ( дескриптор, длина, разделитель, ограничитель) Функция читает строку из файла и разбивает ее по символу разделитель.
Формат CSV является одним из форматов, в котором могут сохранять файлы MS Excel, MS Access и ряд др. программ.
Запись в файлы осуществляется функциями fputs и fwrite: fputs (дескриптор, строка [, длина ]) fwrite (дескриптор, строка [, длина ])
Второй аргумент представляет собой строку, которая должна быть записана в файл. Если третий аргумент не указан, записывается вся строка.
В этом примере в файл "file.txt" записывается строка <? $file = fopen ("file.txt","r+"); $str = «Мировые информационные ресурсы"; if ( !$file ) { echo("Ошибка открытия файла"); } else { fputs ( $file, $str); } fclose ($file); ?> Файл открыт для чтения и записи; указатель установлен в начало файла
БЫЛО: СТАЛО:
ПРИМЕР (СЧЕТЧИК) Открыть файл только для чтения; указатель устанавливается в начало файла Создать новый пустой файл только для записи; если файл с таким именем уже есть - вся информация в нем уничтожается
Функция include() включает в сценарий фрагменты кода, сохраненные в других файлах
Примечание. Функция include() включает в сценарий фрагменты кода, сохраненные в других файлах.
Копирование файлов copy (имя_файла_1, имя_файла 2)
Переименование файла rename (старое_имя, новое_имя)
Удаление файла unlink (имя_файла)
Работа с каталогами
Для установки текущего каталога применяется функция chdir: chdir (каталог)
Работать с этой функцией можно следующим образом: chdir("/tmp/data"); // переход по абсолютному пути chdir("./js"); // переход в подкаталог текущего каталога chdir(".."); // переход в родительский каталог
Чтобы узнать текущий каталог getcwd (путь)
Открыть каталог opendir (путь)
Прочитать каталог dir ( каталог) Эта функция возвращает имена элементов, содержащихся в каталоге. Кроме файлов и папок в каталогах находятся также элементы "." и "..".
Текущий каталог, можно открыть, указав его имя как ".": $dir = opendir (".");
Закрытие каталога closedir (дескриптор)
Пример чтения и вывода файлов, находящихся в текущем каталоге. <? $dir = opendir ("."); echo "Files: "; while ($file = readdir ($dir)) { echo "$file "; } closedir ($dir); ?>
Можно исключить значения "." и ".." следующим образом: <? $dir = opendir ("."); while ( $file = readdir ($dir)) { if (( $file != ".") && ($file != "..")) { echo "$file "; } closedir ($dir); ?>
В качестве примера на рассмотренные функции, создадим скрипт, удаляющий все файлы из каталога c:/temp, к которым не было доступа в течение суток. Функция удаления файлов в этом случае вызывается рекурсивно.
<? function delTemporaryFiles ($directory) { $dir = opendir ($directory); while (( $file = readdir ($dir))) { if( is_file ($directory."/".$file)) { $acc_time = fileatime ($directory."/".$file); $time = time(); if (($time - $acc_time) > 24*60*60) { if ( unlink ($directory."/".$file)) { echo ("Файлы успешно удалены"); } } }
else if ( is_dir ($directory."/".$file) && ($file != ".") && ($file != "..")) { delTemporaryFiles ($directory."/".$file); } closedir ($dir); } delTemporaryFiles ("c:/temp"); ?>
Создание каталогов mkdir ( имя_каталога) В случае неудачи возвращает false.
Удалить каталог rmdir ( имя_каталога)
При чтении данных из файла указатель текущей позиции перемещается к очередному непрочитанному символу. Установка указателя текущей позиции в начало файла rewind ( дескриптор)
Узнать текущее положение указателя можно при помощи функции ftell: ftell ( дескриптор)
Установливает указатель в любое место файла fseek ( дескриптор, смещение [, int whence ]) Функция устанавливает указатель файла на байт с о смещением offset (от начала файла, от его конца или от текущей позиции, в зависимости от значения параметра whence).
Аргумент file представляет собой дескриптор файла. Аргумент whence задает с какого места отсчитывается смещение offset и может принимать одно из следующих значений: SEEK_SET (отсчитывает позицию начала файла); SEEK_CUR (отсчитывает позицию относительно текущего положения указателя); SEEK_END (отсчитывает позицию относительно конца файла). По умолчанию аргумент whence имеет значение SEEK_SET.
Узнать, находится ли указатель в конце файла, можно с помощью функции feof: feof (file) Если указатель находится в конце файла, функция возвращает true, в ином случае возвращается false.
Функцию feof удобно использовать при чтении файла: <? $file = fopen ("file.txt","r"); if ($file) { while(!feof($file)) { $str = fgets($file); echo $str; echo (" "); } fclose ( $file); } else { echo("Ошибка открытия файла"); } ?>
При помощи этой функции удобно также определять количество строк в файле: <? $file = fopen ("file.txt","r"); if ($file) { $counter = 0; while(!feof($file)) { $str = fgets ($file); $counter++; } echo($counter); fclose ($file); } else { echo("Ошибка открытия файла"); } ?>
Для получения дополнительной информации об атрибутах файла можно воспользоваться следующими функциями. Функция file_exists проверяет, существует ли файл и возвращает true, если файл существует и false в противном случае: file_exists (filename)
Функция fileatime возвращает время последнего обращения к файлу: fileatime (filename)
Функция filemtime возвращает время последней модификации содержимого файла: filemtime (filename)
Функция file_size возвращает размер файла в байтах: file_size (filename)
Функция file_type возвращает тип файла: file_type (filename) Строка, возвращаемая этой функцией, содержит один из следующих типов файла: char (специальное символьное устройство); dir (каталог); fifo (именованный канал); link (символическая ссылка); block (специальное блочное устройство); file (обычный файл); unknown (тип не установлен).
Поскольку использование функций, возвращающих характеристики файла, весьма ресурсоемко, во избежание потери производительности при вызовах таких функций, PHP кэширует информацию о файле. Очистить этот кэш можно с помощью функции clearstatcache: <? clearstatcache(); ?>