2012-01-20 10 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); 
} 

これは、プロパティ「名前」はファイルパスでクラス内にあります。

30MBを超えるファイルでテストしたときに最大限のメモリを超えてしまうというエラーが発生したため、一度に1000バイトを書きます。

+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; 
} 

私はそれも、単一のファイルハンドルを使用して、場所(つまり、2番目のファイルを使用していない)でファイルを変更することが可能だろうと信じています - しかし、コードがちょっと混乱し、シークがたくさん必要になります(その後ftruncate)。

NBは、PHPでデータを管理するためのファイル(および他の多くの言語をマルチユーザコンテキストで使用する)を使用することはお勧めできません。

+0

大容量のファイルはどうですか?私は最大のメモリエラーを取得 – mowwwalker

+0

いいえアイデア - あなたのコードの欠けているビット – symcbean

関連する問題