Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Работа с файламиАвтор: Alan
FreePHP Я так уж и быть упущу некоторые технические подробности, которые можно было бы описать всего двумя словами: В Unix- системах для отделения одной строки от другой используется \n , a в Windows \r\n , а в MacOS \n\r. И для того, чтобы языки программирования были легче переносимы с одной операционной системы на другую, эта комбинация преобразуется автоматически при чтении текстовых файлов. Открытие файлаРабота с файлами в PHP очень напоминает работу с файлами в Си. То есть, сначала файл открывается в нужном режиме, при этом возвращается некоторое целое число. Следующим этапом идет собственно работа с самим фалом (чтение, запись...) Последним этапом есть закрытие файла. Некоторое программисты утверждают, что файл можно не закрывать, так как PHP автоматически закрывает все открытые файлы по завершению сценария. Это всё правда, но лично я вам рекомендую закрывать самим фалы, воспринимайте это как хороший стиль кодинга. fopen ($filename, $mode, $use_other_path=false) Итак, мы открываем файл $filename в режиме $mode. Лично я очень редко использую третий параметр $use_other_path, он означает, что если не указан относительный путь к файлу, его нужно искать среди путей используемых конструкциями include и require. Пред вами список значений, которые может принимать параметр $mode:
В конце любой из строк r,w,a,r+,w+,a+ может находиться ещё один символ- "b" или "t". Если указан "b", то файл открывается в режиме бинарного чтения/записи. Если "t", устанавливается режим трансляции символа перевода строки. О режиме "t" нет ни слова в документации, но поверим Дмитрию Котерову, который утверждает, что этот режим работает во всех системах. Всё это можно продемонстрировать на примере: <? /* Получает в параметрах строку и возвращает через пробел коды символов, из которых она состоит */ function makehex($st) { for($i=0; $i<strlen($st); $i++) $hex[]= sprintf ("%2X", ord($st[$i])); return join (" ",$hex); } # открываем файл разными способами $f= fopen("test.php","r"); echo makehex(fgets($f,100))."\n"; $f= fopen("test.php","rt"); echo makehex (fgets($f,100))."\n"; ?> Первая строчка файла test.php состоит всего из двух символов "<?", за ними должен следовать маркер конца строки. Скрипт показывает, как выглядит этот маркер, то есть состоит ли он из одного или из двух символов. Запускаем скрипт в Unix. Получаем две одинаковые строки: 3С 3F 0A 3C 3F 0A Значит, в этой системе физический конец строки обозначается одним символом- кодом 0x0A или \n. Если запустить скрипт в Windows, получим: 3С 3F 0D 0A 3C 3F 0A Бинарное и текстовое чтение дали разные результаты. Не используйте обратные слэши в именах файлов. Если вы работаете в Windows, то эти слэши будут автоматически переведены в нормальные. Если вы просто не можете обойтись без обратного слэша, не забудьте удвоить его, так он воспринимается как спецсимвол. Конструкция or die().($f=fopen("/homa/user/file.txt","r")) or die ("error"); Если файл не открылся, то ошибка. Всё довольно просто. Стоит заметить, что or нельзя заменить на "|", потому что последний имеет более высокий приоритет. Безымянные временные файлы.Довольно часто нам необходимо занести какую-то информацию во временное хранилище. Не скажу, что для реализации повседневных задач подойдёт способ создания временных файлов, но... Для этого умные дядьки- разработчики PHP придумали функцию tmpfile(). Эта функция создает новый файл, доступный для чтения и записи, с уникальным именем. Далее можно будет работать только с файловым дескриптором, имя файла недоступно. Место, занимаемое временным файлом, освобождается сразу после закрытия файла или завершении работы сценария. Закрытие файла.Как я (и не только я ) говорил, после работы с файлом его желательно закрыть. Делается это функцией fclose($fp). Эта функция закрывает файл, открытый функцией fopen() (или аналогичными функциями). Возвращает false, если закрыть файл не удалось. Вы ВСЕГДА должны закрывать FTP- и HTTP - соединения. Блочные чтение/запись.fread($f, $numberbytes); Читает из файла $f $numberbytes символов и возвращает строку этих символов. Если $numberbytes больше чем чем можно считать, то возвращается то что удалось. fwrite($f, $st); Запсывает в файл $f содержимое строки $st. В некоторых клинических случаях функции fread() и fwrite() можно использовать для копирования файлов. Построчные чтение/запись.fgets($f, $dlina); Считывает из файла одну строку, заканчивающиюся символом новой строки \n. На первый взгляд это очень полезная функция. котороая позволяет пройтись по стркам в файле. Но по моему скромному мнению (что радует, так это то, что в этом я не одинок) более рационально использовать функцию file(). fputs($f, $st); Аналогична функции fwrite(). Чтение CSV- фала.Очень много людей использует такую замысловатую программу, как Microsoft Excel. Потому мудрые разработчики PHP придумали специальную функцию для работы с одним из видов файлов, в который может сохранять эта программа. fgetcsv($f, $dlina, $delit=','); Данная функция счтывает одну строку из файла $f, и разбивает её по символу $delit. Параметр $delit обязательно должен быть длиной в один символ. Параметр $dlina задаёт максимальную длину строки. Пустые строки не игнорируются, а возвращаются как список из одного элемента. fgetcsv() работает чуть пошустрее, чем 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 "<h4> Стока номер $i ($num полей):</h3>"; for ($c=0; $c<$num; $c++) print "[$c]: $data[$c] "; } fclose($f); Полежение указателя текущей позиции.feof($f) Возвращает true, если достигнут конец файла. Чаще всего эта функция используется так: $f= fopen("my_file.txt","r"); while (!feof($f)) { $st=fgets($f); // обрабатываем очередную строку $st } fclose($f); Я думаю, что не стоит лишний раз делать акцент на том, что если попадётся большой файл, эта фунция будет довольно долго думать. fseek($f, $offset, $whence=SEEK_SET) Устанавливает указатель на байт со смещением $offset. Параметр $whence задаёт, с какого места отчитыватся смещение $offset.
!! В случае успешного завершения функция возвращает 0, а в случае провала -1. ftell($f) Возвращает положение указателя файла. |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Рейтинги
|