在PHP中删除文件节?

在PHP中删除文件节?,php,file,Php,File,我是PHP的初学者,我仍在尝试制定适当的文件处理技术。我通常可以尝试错误,但当涉及到删除和修改数据时,我总是希望安全起见 我在下面编写代码是为了删除文件的某个部分,但我不确定它是否适用于更大的文件,或者在需要经验来编写代码的不可预见的情况下 我刚刚测试了它,它确实起了作用,但我想先让更有经验的程序员来运行它: function deletesection($start,$len){ $pos=0; $tmpname=$this->name."tmp.tmp"; $t

我是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);
}
函数删除节($start,$len){
$pos=0;
$tmpname=$this->name.“tmp.tmp”;
$tmpf=fopen($tmpname,“wb+”);
倒带($tmpf);
$h=fopen($this->name,“rb”);
倒带($h);
而(!feof($h)){
$this->xseek($h,$pos);
$endpos=$pos+1000;
如果($endpos>$start&&$posname);
重命名($tmpname,$this->name);
}
这是在一个类中,属性“name”是文件路径


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

我快速查看了您的代码-似乎有点复杂,如果要删除的部分相对于总文件大小较小,复制整个文件的效率也会降低

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)


注意:使用PHP(以及多用户环境中的大多数其他语言)管理数据的文件这不是一个好主意。

这可能是一个更好的问题。说,乍一看,这看起来很好。也许有点迂回。考虑添加注释到每个部分解释为什么它正在做。也考虑增加你的等号周围的空间和逗号的右边,为了额外的可读性。