Удалить первые строки из файла

alexz15

Постоялец
Регистрация
3 Окт 2008
Сообщения
394
Реакции
194
Всем привет!
Есть файл, в который записываются данные. По истечению указанного размера из файла должны удаляться часть старых строк, и записываться новые. Сейчас у меня такой код:
PHP:
    $fp = fopen($txt, 'a');
    flock ($fp, LOCK_EX);
 
    if (filesize($txt) >= 100000) { // если превышает
        ftruncate ($fp, 100000 / 2);// то удаляем половину
    }
 
    foreach ($str as $output) {
        fwrite($fp, $output."\r\n"); // и пишем новые данные
    }
 
    fflush ($fp);
    flock ($fp,LOCK_UN);
    fclose($fp);
проблема в том, что удаляются последние строки, а старые остаются на месте.
можно рассмотреть еще такой вариант: перед удалением сначала перемешать все строки в $txt, затем удалить половину и записать в конец новые данные.
я дал пример в 100кб, но файл может быть большим. заранее благодарен за идею или код.
 
Попробуй это:

PHP:
function ftruncatestart($filename, $nsize)
{
    $nsize = filesize($filename);
    if( $nsize < ($nsize*1.0) ) return;
 
    $nsize = $nsize*0.5;
 
    if( $fh = fopen($filename, "r+") ) {
        $start = ftell($fh);
 
        fseek($fh, -$nsize, SEEK_END);
 
        $drop  = fgets($fh);
        $offset = ftell($fh);
       
        for($x=0; $x < $nsize; $x++) {
            fseek($fh, $x+$offset);
            $c = fgetc($fh);
            fseek($fh, $x);
            fwrite($fh, $c);
        }
       
        ftruncate($fh, $nsize - strlen($drop));
        fclose($fh);
    }
}
 
А если как-то так:

PHP:
$file = file('some_file.txt'); // читаем файл в массив: каждая строка - отдельный элемент массива
$result = array_slice($file, 100); // Удаляем 100 первых записей из массива
file_put_contents('some_file.txt' , implode($result), LOCK_EX);// складываем оставшееся назад в файл
 
cruide, скорее всего то что надо, но я так понял, что бы записать новые данные нужно еще раз открывать файл? в твоей функции названия переменных $nsize нужно подправить.

ShaDeRzz, файл может быть большим.

еще такой вопрос появился. не могу понять, почему записывается несколько раз одни и те же данные. если написать так:
PHP:
    $fp = fopen($rezervuar, 'a');
   
    foreach ($str as $output)
    {
        echo($output."\r\n");
    }
 
    fclose($fp);die;
выведет как положено 50 строк.
если так:
$fp = fopen($rezervuar, 'a');

foreach ($str as $output)
{
fwrite($fp, $output."\r\n");
}

fclose($fp);
запишет в файл 350 строк, т.е. 7 раз одно и то же. в чем может быть причина?

---

сорри, это мой баг, буду искать решение..
 
Назад
Сверху