2012-01-20 2 views
0

Я начинающий на PHP, и я все еще пытаюсь разработать правильные методы обработки файлов. Обычно я в порядке с проб и ошибок, но когда дело доходит до удаления и изменения данных, мне всегда нравится быть в безопасности.Удаление раздела файлов в PHP?

Я написал код ниже, чтобы удалить определенный раздел файла, но я не уверен, будет ли он работать с более крупными файлами или в непредвиденных условиях, для которых требуется опыт для кодирования.

Я испытал это только сейчас, и он сделал работу, но я хотел бы, чтобы запустить его с помощью более опытных программистов первым:

function deletesection($start,$len){ 
    $pos=0; 
    $tmpname=$this->name."tmp.tmp"; 
    $tmpf=fopen($tmpname,"wb+"); 
    rewind($tmpf); 
    $h=fopen($this->name,"rb"); 
    rewind($h); 
    while(!feof($h)){ 
     $this->xseek($h,$pos); 
     $endpos = $pos+1000; 
     if($endpos>$start && $pos<$start+$len){ 
      $readlen=$start-$pos; 
      $nextpos=$start+$len; 
     } 
     else{ 
      $readlen=1000; 
      $nextpos=$pos+1000; 
     } 
     fwrite($tmpf,fread($h,$readlen)); 
     $pos=$nextpos; 
    } 
    fclose($h); 
    unlink($this->name); 
    rename($tmpname,$this->name); 
} 

Это внутри класса, где «имя» свойства является путем к файлу ,

Я пишу файл по 1000 байт за раз, потому что я получал ошибки в максимальном объеме памяти, превышающем при тестировании файлов более 30 МБ.

+0

Это может быть лучший вопрос для [нового бета-сайта Code Review] (http://codereview.stackexchange.com/). Тем не менее, это выглядит с первого взгляда. Возможно, немного круглая. Подумайте о добавлении комментариев в каждый раздел, объясняющий * почему * того, что он делает. Также рассмотрите возможность добавления пробелов вокруг ваших равных знаков и справа от запятых, для дополнительной удобочитаемости. – Charles

ответ

1

У меня был быстрый взгляд на ваш код - кажется немного сложным, а также копирование весь файл будет менее эффективным, если секция для удаления мала по отношению к общему размер_файла ...

function deletesection($filename, $start, $len) 
{ 
$chunk=49128; 
if (!is_readable($filename) || !is_writeable($filename) || !is_file($filename)) { 
    return false; 
} 
$tfile=tempnam(); // used to hold stuff after the section to delete 
$oh=fopen($tfile, 'wb'); 
$ih=fopen($filename, 'rb'); 
if (fseek($ih, $start+$len)) { 
    while ($data=fgets($ih, $chunk) && !feof($ih) { 
    fputs($oh,$data); 
    } 
    fclose($oh); $oh=fopen($tfile, 'rb'); 
     // or could just have opened it r+b to begin with 
    fseek($ih, $start, SEEK_SET); 
    while ($data=fgets($oh, $chunk) && !feof($oh) { 
    fputs($ih, $data); 
    } 
} 
fclose($oh); 
fclose($ih); 
unlink($tfile); 
return true; 
} 

Я считаю, что было бы возможно сделать это, изменив файл на месте (т. Е. Не используя второй файл), используя один дескриптор файла, но код будет немного беспорядочным и потребует много запросов (затем ftruncate).

NB использование файлов для управления данными с использованием PHP (и большинства других языков в многопользовательском контексте) не является хорошей идеей.

+0

Как насчет больших файлов? Я получаю ошибки максимальной памяти – mowwwalker

+0

Идея - нет битов вашего кода – symcbean

Смежные вопросы