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

Статус
В этой теме нельзя размещать новые ответы.
Короче мое резюме - нет, так просто дописать к началу произвольного файла текст не получится.

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

<?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>";
?>
 
Ну зачем так категорично, на никсах всегда можно найти пусть и извращенный, но действенный способ решения той или иной задачи, - как например:

И чо? Оно все равно будет перезаписывать весь файл. Если попробуешь добавить строчку в начало какой-нибудь гиговой базы - заметишь по времени, cat отработает не быстрее чем втупую копирование всей базы. Хотя добавлял ты всего лишь какую-нибудь жалкую строку в 200 байт.
 
К сожалению записать в начало файла без перезаписи всего файла невозможно. Но чтобы не считывать весь файл в память можно использовать такой велосипед:
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);
}
 
fopen( '/path/to/file', 'c' );
 
fopen( '/path/to/file', 'c' );
Вы бы хотя бы в документацию заглянули.
Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от 'w'), и вызов к этой функции не вызывает ошибку (также как и в случае с 'x'). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотри Для просмотра ссылки Войди или Зарегистрируйся) перед изменением, так как использование 'w' может обрезать файл еще до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию Для просмотра ссылки Войди или Зарегистрируйся после запроса на блокировку).
Если записать данные то перезапищутся n байт записываемой строки с начала файла.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху