1

みなさんおはようございます。
私は少し立ち往生しています。特定の条件下でのみファイルを開いて空にする方法はありますか?


1. fopen(file)-> flock->ファイルの内容を読み取る2.
特定の条件が満たされた場合は、ファイルの内容を置き換えます
3.ロックを解除してfclose
問題は次のとおりです。
fopen (file, w+)事前にファイルを空にします。だから私はコンテンツを読むことができません私が
fopen (file, r+)それに書き込みたい場合はファイルを空にしません

ftruncate($fn,0)と組み合わせて試しましr+たが、ファイルに「null」が書き込まれます
。回避策は、最初にファイルの内容を読み取り、次にそれを開くことです。しかし、私は読んだ瞬間から終了するまでファイルのロックを維持しようとしています。
誰かアイデアはありますか?

編集:
問題はのようfwriteです。 ftruncateファイルをクリアしますがfwrite、「nul」を追加します。100回のパスの後、データの前に100個の「nul」があります

$pt = "../path/file";  
$fn = lock_file($pt);  
$i = fread($fn,100);  
ftruncate($fn,0);  
fwrite($fn,"data");  
fflush($fn);  
flock($fn, LOCK_UN);  
fclose($fn);        

function lock_file($file){
$fn = fopen($file, "c+");  
$try=0;  
do{  
if($try>0){usleep(rand(1,10000));}
$try ++;
}
while(!flock($fn, LOCK_EX | LOCK_NB) and $try <= 300);
if($try>=300){return FALSE;}
return $fn;
}

fseek($fn, 0); おかげで解決しました!

4

3 に答える 3

1
fopen($fn, "a+");//opens file for appending, does not erase contents
fseek($fn, 0);//moves pointer to first position in file

その後、必要に応じてftruncateを呼び出すことができます。

于 2012-09-20T08:33:02.333 に答える
1

「w」の代わりに「c」または「c+」モードを検討しましたか?

PHPマニュアルが言うように:

'c'これは、ファイルを変更する前にアドバイザリロック(flock()を参照)を取得する必要がある場合に役立ちます。'w'を使用すると、ロックが取得される前にファイルが切り捨てられる可能性があるためです(切り捨てが必要な場合は、ftruncate( )ロックが要求された後に使用できます)。

UPD:上記のコードについて:

私はあなたのコードを試しましたが、ファイルの先頭にnullがあります。しかし、私が追加したとき

 fseek($fn, 0);

 ftruncate($fn, 0);

すべてがうまくいきました(fseekなしで、0が追加されています)

于 2012-09-20T08:34:07.800 に答える
0
fopen($fn, 'c+'); // open the files in read / write, doesn't truncate on opening
fread($fn);
ftruncate($fn, 0);
于 2012-09-20T08:34:38.570 に答える