Как правильно добавить строку в начало файла?

Статус
В этой теме нельзя размещать новые ответы.

steel_HILL

Постоялец
Регистрация
15 Апр 2010
Сообщения
53
Реакции
14
Короче мое резюме - нет, так просто дописать к началу произвольного файла текст не получится.

Ну зачем так категорично, на никсах всегда можно найти пусть и извращенный, но действенный способ решения той или иной задачи, - как например:

<?php
$fl_main = "main.txt";
$fl_temp = "temp.txt";
$tmp_str="строка для записи в начало файла\n";

$fh_temp = fopen($fl_temp, "w");
if (fwrite($fh_temp, $tmp_str) === FALSE){
die('Ошибка записи в файл...');
}
@fclose($fh_temp);

$output = shell_exec('cat '.$fl_temp.' '.$fl_main.' > '.$fl_main);
echo "<pre>$output</pre>";
?>
 

venetu

Мой дом здесь!
Регистрация
28 Мар 2007
Сообщения
745
Реакции
273
Ну зачем так категорично, на никсах всегда можно найти пусть и извращенный, но действенный способ решения той или иной задачи, - как например:

И чо? Оно все равно будет перезаписывать весь файл. Если попробуешь добавить строчку в начало какой-нибудь гиговой базы - заметишь по времени, cat отработает не быстрее чем втупую копирование всей базы. Хотя добавлял ты всего лишь какую-нибудь жалкую строку в 200 байт.
 

polo

Создатель
Регистрация
4 Окт 2006
Сообщения
29
Реакции
11
К сожалению записать в начало файла без перезаписи всего файла невозможно. Но чтобы не считывать весь файл в память можно использовать такой велосипед:
PHP:
function fwritePrepend($filename, $new_data)
{
    touch($filename);
    $fp = fopen($filename, 'r+');

    $len = strlen($new_data);
    $final_len = filesize($filename) + $len;
    $old_data = fread($fp, $len);
   
    rewind($fp);
    $count = 1;
    while (ftell($fp) < $final_len)
    {
        fwrite($fp, $new_data);
        $new_data = $old_data;
        $old_data = fread($fp, $len);
        fseek($fp, $count * $len);
        $count++;
    }
    fclose($fp);
}
 

BDSG

Постоялец
Регистрация
28 Фев 2009
Сообщения
203
Реакции
110
fopen( '/path/to/file', 'c' );
 

polo

Создатель
Регистрация
4 Окт 2006
Сообщения
29
Реакции
11
fopen( '/path/to/file', 'c' );
Вы бы хотя бы в документацию заглянули.
Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от 'w'), и вызов к этой функции не вызывает ошибку (также как и в случае с 'x'). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотри Для просмотра ссылки Войди или Зарегистрируйся) перед изменением, так как использование 'w' может обрезать файл еще до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию Для просмотра ссылки Войди или Зарегистрируйся после запроса на блокировку).
Если записать данные то перезапищутся n байт записываемой строки с начала файла.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху