在PHP中删除文件部分?

时间:2012-01-20 06:15:08

标签: php file

我是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);
}

这是在属性“name”是文件路径的类中。

我正在一次写入1000个字节的文件,因为在测试超过30mb的文件时,我遇到了超出最大内存量的错误。

1 个答案:

答案 0 :(得分: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数据(以及多用户上下文中的大多数其他语言)并不是一个好主意。