2012-01-20 51 views
0

我在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測試時被超過。

+0

對於[新代碼評測測試網站](http://codereview.stackexchange.com/),這可能是一個更好的問題。也就是說,乍一看這看起來很好。也許有點迂迴。考慮在每個部分添加註釋,解釋它爲什麼做的原因。還要考慮在等號和逗號右側添加空格,以提高可讀性。 – Charles

回答

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)。

使用(在多用戶環境和大多數其他語言)管理與PHP的數據文件NB是不是一個好主意。

+0

雖然大文件呢?我得到了最大的內存錯誤 – mowwwalker

+0

不知道 - 你的代碼中缺少一些部分 – symcbean