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

Тема в разделе "Как сделать...", создана пользователем alexz15, 3 авг 2012.

  1. alexz15

    alexz15

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

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    Попробуй это:

    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, -$nsizeSEEK_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);
        }
    }
     
    alexz15 нравится это.
  3. ShaDeRzz

    ShaDeRzz

    Регистр.:
    16 окт 2007
    Сообщения:
    176
    Симпатии:
    65
    А если как-то так:

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

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    ShaDeRzz

    представь, что файл размером в 10Мб :)

    alexz15

    просто вместо ftruncate используй ftruncatestart и всё
     
  5. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    189
    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 раз одно и то же. в чем может быть причина?

    ---

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