我是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的文件时,我遇到了超出最大内存量的错误。
答案 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数据(以及多用户上下文中的大多数其他语言)并不是一个好主意。