Эта тема на forum.dklab.ru


Юрий Насретдинов:
Сколько ни тестировал, вроде бы работает правильно. Переношу в «Склад»

Перенесено из форума: Разное :: PHP.
Перенесено в форум: Склад готовых решений :: PHP.
Юрий Насретдинов:
Ещё раз хочу упомянуть, что библиотека имеет _смысл_, если файл открыт в режиме "r+b" или "x+b". В любом случае Вы должны открывать в режиме, содержащем «+», чтобы библиотека могла делать предварительное чтение нужного куска с данными. Сама библиотека этого не проверяет.

P.S. Работа в режиме «w+b» возможна, но не имеет особого смысла, ибо процедура возврата к начальному положению тривиальна: ftruncate($fp,0);

Также учтите, что при работе с удаленными файлами (к примеру, $fp = fopen('ftp://.../somefile.txt', 'r+b'); ) или какими-то другими видами дескрипторов, которые выдают себя за файловый, необходимо осуществлять операции ввода-вывода блоками не более 8 Кб (максимальный буфер fread в таких случаях) из-за особенностей библиотеки.
Юрий Насретдинов:
Немного изменил функцию rdfopen, чтобы она не требовала обязательно 4 параметра, соответственно работала бы правильно и при меньшем их количестве (из-за идиотского прототипа fopen, который был введен в 5 версии, 4 параметр не имеет никакого дефолтного значения, и не может быть указан явно, так что fopen вызывается с переменным числом аргументов в зависимости от того, что хочет программист, который использует мой класс).
Rumata:
Что мешает абсолютно (!!!) все аргументы загнать в единый ассоц.массив?

function rfopen($options=array())
{
static $defOptions = array(
'mode' => 'a',
'use_include_path' => 0,
'context' => null,
);
$options = array_merge($defOptions, (array)$options);

// далее ваши черные дела
}

Юрий Насретдинов:
Дело в том, что если контекст не нужен, то его вообще не нужно передавать! Даже передача null это ошибка (можете сами проверить). Поэтому такие извращения.
Юрий Насретдинов:
Ну и плюс к тому, интерфейс проектировался так, чтобы можно было безболезненно заменить все вызовы fopen/fputs/ftruncate/fclose на соответствующие эквиваленты, без необходимости переделывать аргументы. Поэтому я и не ввел, к примеру, передачу параметров в виде ассоциативного массива.
Rumata:
http://forum.dklab.ru/viewtopic.php?p=161595#161595
Юрий Насретдинов:
Rumata
И всё же, что именно я должен там прочесть?
Rumata:
Ничего более того, что написано.
Юрий Насретдинов:
Rumata
Это ссылка на моё сообщение, и я не очень понимаю, какое это отношение имеет к моему классу :)?
Юрий Насретдинов:
Поправил поведение rfputs() в случае, если не указан параметр $length и передаётся обычный файловый указатель (не открытый с помощью rfopen, или открытый в режиме append) -- теперь он не обрезает данные до нулевой длины :).

Также, операции rftruncate и rfrollback теперь сохраняют положение в файле, что больше соответствует поведению стандартных функций (а именно, ftruncate).
Юрий Насретдинов:
Выделено из темы «Класс (в виде набора функций) для проведения операций с файлами с возможностью отмены изменений»,
расположенной в форуме Склад готовых решений :: PHP (14 Сентября 2009, 03:29).

Эта тема на forum.dklab.ru