在PHP中删除文件节?
我是PHP的初学者,我仍在尝试制定适当的文件处理技术。我通常可以尝试错误,但当涉及到删除和修改数据时,我总是希望安全起见 我在下面编写代码是为了删除文件的某个部分,但我不确定它是否适用于更大的文件,或者在需要经验来编写代码的不可预见的情况下 我刚刚测试了它,它确实起了作用,但我想先让更有经验的程序员来运行它:在PHP中删除文件节?,php,file,Php,File,我是PHP的初学者,我仍在尝试制定适当的文件处理技术。我通常可以尝试错误,但当涉及到删除和修改数据时,我总是希望安全起见 我在下面编写代码是为了删除文件的某个部分,但我不确定它是否适用于更大的文件,或者在需要经验来编写代码的不可预见的情况下 我刚刚测试了它,它确实起了作用,但我想先让更有经验的程序员来运行它: function deletesection($start,$len){ $pos=0; $tmpname=$this->name."tmp.tmp"; $t
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(以及多用户环境中的大多数其他语言)管理数据的文件这不是一个好主意。这可能是一个更好的问题。说,乍一看,这看起来很好。也许有点迂回。考虑添加注释到每个部分解释为什么它正在做。也考虑增加你的等号周围的空间和逗号的右边,为了额外的可读性。