используя fseek для вставки строки перед последней строкой - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь написать очень простой модуль регистрации для AjaxChat blueimp.net. У меня есть скрипт, который пишет в файл конфигурации пользователя.

$userfile = "lib/data/users.php";
$fh = fopen($userfile, 'a');
$addUser = "string_for_new_user";
fwrite($fh, $addUser);
fclose($fh);

Но мне нужно вставить $addUser перед самой последней строкой, которая ?>

Как бы мне этого добиться, используя fseek?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Если вы всегда знаете, что файл заканчивается на?> И ничего более, вы можете:

$userfile = "lib/data/users.php";
$fh = fopen($userfile, 'r+');
$addUser = "string_for_new_user\n?>";
fseek($fh, -2, SEEK_END);
fwrite($fh, $addUser);
fclose($fh);

Чтобы еще больше улучшить ответ: вы захотите открытьВаш файл в режиме r+ из-за следующего примечания относительно fseek:

Примечание:

Если вы открылифайл в режиме добавления (a или a +), любые данные, которые вы записываете в файл, всегда будут добавляться независимо от положения файла, и результат вызова fseek () будет неопределенным.

fseek($fh, -2, SEEK_END) поместит позицию в конец файла, а затем переместит его назад на 2 байта (длина ?>)

0 голосов
/ 19 марта 2012

Еще один способ сделать это - использовать класс SplFileObject (доступен с PHP 5.1).

$userfile = "lib/data/users.php";
$addUser = "\nstring_for_new_user\n";
$line_count = 0;

// Open the file for writing
$file = new SplFileObject($userfile, "w");

// Find out number of lines in file
while ($file->valid()) {
   $line_count++;
   $file->next();
}

// Jump to second to last line
$file->seek($line_count - 1);

// Write data
$file->fwrite($add_user);

Я не проверял это (я не могу на компьютере, которым я сейчас пользуюсь), поэтому я не уверен, работает ли он именно так. Дело в том, что это действительно классный seek () метод SplFileObject, который может искать по строке, а не как fseek () ищет в байтах.

...