| |
ыстрее пары fgets()/explode(), но зато она,
как мы можем видеть, гораздо менее универсальна. Применяйте ее в таком
контексте:
$f=fopen("file.csv","r") or die("Ошибка!");
for($i=0; $data=fgetcsv($f, 1000, ";"); $i++) {
$num = count($data);
if($num==1 && $data[0]==="") continue;
echo "Строка номер $i ($num полей):";
for($c=0; $c<$num; $c++)
print "[$c]: $data[$c] ";
}
fclose($f);
Положение указателя текущей позиции
int feof(int $f)
Возвращает true, если достигнут конец файла (то есть если указатель файла уста-
новлен за концом файла). Эта функция чаще всего используется в следующем
контексте: $f=fopen("myfile.txt","r");
while(!feof($f))
{ $st=fgets($f);
// теперь мы обрабатываем очередную строку $st
// . . .
Глава 15. Работа с файлами 253
}
fclose($f);
Лучше избегать подобных конструкций, т. к. в случае больших файлов они довольно
медлительны. Лучше читайте файл целиком при помощи File() (см. ниже) или
fread() — конечно, если вам нужен доступ к каждой строке этого файла, а не
толь-
ко к нескольким первым!
int fseek(int $f, in $offset, int $whence=SEEK_SET)
Устанавливает указатель файла на байт со смещением $offset (от начала файла, от
его конца или от текущей позиции, в зависимости от параметра $whence). Это,
впро-
чем, может и не сработать, если дескриптор $f ассоциирован не с обычным локаль-
ным файлом, а с соединением HTTP или FTP.
Параметр $whence, как уже упоминалось, задает, с какого места отсчитывается
сме-
щение $offset. В PHP для этого существуют три константы, равные, соответствен-
но, 0, 1 и 2:
r SEEK_SET — устанавливает позицию начиная с начала файла;
r SEEK_CUR — отсчитывает позицию относительно текущей позиции;
r SEEK_END — отсчитывает позицию относительно конца файла.
В случае использования последних двух констант параметр $offset вполне может
быть отрицательным (а при применении SEEK_END он будет отрицательным наверня-
ка).
Как это ни странно, но в случае успешного завершения эта функция возвращает 0,
а в
случае неудачи -1. Почему так сделано — неясно. Наверное, по аналогии с ее Си-
эквивалентом?
int ftell(int $f)
Возвращает положение указателя файла. Собственно, вот и все, что делает эта
функ-
ция.
Функции для определения
типов файлов
Помимо уже рассмотренных, PHP имеет также набор вспомогательных (и весьма удоб-
ных) функций для работы с файлами. Они отличаются тем, что работают не с
файловыми
идентификаторами, а непосредственно с их именами.
Определение типа файла
bool file_exists(string $filename)
Часть IV. Стандартные функции PHP 254
Возвращает true, если файл с именем $filename существует на момент вызова.
Используйте эту функцию с осторожностью! Например, следующий код никуда не
годится с точки зрения безопасности:
$fname="/etc/passwd";
if(!file_exists($fname)
$f=fopen($fname,"w");
else
$f=fopen($fname,"r");
Дело в том, что между вызовом file_exists() и открытием файла в режиме w про-
ходит некоторое время, в течение которого другой процесс может "вклиниться" и
"подменить" используемый нами файл. Сейчас это все кажется маловероятным, но
данная проблема выходит на передний план при написании сценария счетчика. Мы
еще остановимся на ней чуть позже.
string filetype(string $filename)
Возвращает строку, которая описывает тип файла с именем $filename. Если такого
файла не существует, возвращает false. После вызова строка будет содержать одно
из следующих значений:
r file — обычный файл;
r dir — каталог;
r link — символическая ссылка;
r fifo — fifo-канал;
r block — блочно-ориентированное устройство;
r char — символьно-ориентированное устройство;
r unknown — неизвестный тип файла.
Рассматриваемые ниже несколько функций представляют собой лишь надстройку для
функции filetype(). В большинстве случаев они очень полезны, и пользоваться
ими удобнее, чем последней.
bool is_file(string $filename)
Возвращает true, есл
|
|