Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи Web-мастеру » PHP - Все статьи »

Обсудить на форуме Обсудить на форуме

Работа с файлами

Автор: 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 - Файл открывается только для чтения. Если файла не существовало, будет ошибка. После удачного открытия файла указатель устанавливается в начало файла.
  • r+ - файл открывается одновременно и на чтение и на запись. Указатель устанавливается на начало. Если файла не существовало, возвращается false. Ахтунг, если в момент записи указатель установлен где-то посередине файла, то данные запишутся поверх уже существующих.
  • w- Создаётся новый пустой файл. Если на момент вызова уже существовал такой файл, то он уничтожается.
  • w+ - аналогичен r+, но если файла не существовало он создается. Можно работать как в режиме записи так в режиме чтения. Если файл существовал, то его содержимое уничтожается.
  • а- открывает существующий фал в режиме записи и при этом двигает указатель на последний байт файла. Этот режим используют, когда нужно что-то дописать. Вызов проваливается если файла не существовало.
  • а+ - открывает файл в режиме чтения и записи. Указатель устанавливается в конец файла при этом, не уничтожая содержимое файла. Отличается от а тем, что ели до вызова файла не существовало, то он создается.

В конце любой из строк 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.

  • SEEK_SET- устанавливает позицию начиная с начала файла;
  • SEEK_CUR- отсчитывает позицию относительно текущей позиции;
  • SEEK_END- отсчитывает позицию относительно конца файла.

!! В случае успешного завершения функция возвращает 0, а в случае провала -1. ftell($f) Возвращает положение указателя файла.


Может пригодится:


Автор: Alan
Прочитано: 10224
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (1)

Прислал: kelvin
написали бы еще как установить режим "666" || "644" в атрибутах

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру