[英]Deleting File Section in 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个字节的文件,因为在测试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(以及多用户环境中的大多数其他语言)来管理数据不是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.