仅在某些条件下fopen和空文件

时间:2012-09-20 08:29:40

标签: php

早安所有人。
我有点卡住了。有没有办法在某些条件下fopen文件并清空它?

我想要的是:
 1. fopen(文件) - >羊群 - >阅读文件内容
 2.如果满足某些条件,请替换文件的内容
 3.解锁并关闭 问题是:
fopen (file, w+)预先清空文件,因此无法阅读内容 如果我想写文件,fopen (file, r+)不会清空文件

我已将ftruncate($fn,0)r+结合使用,但将“null”写入文件
解决方法是先读取文件内容然后再打开它。但是我试着从阅读的那一刻开始对文件进行锁定直到我完成 任何想法?

编辑:
问题似乎是fwriteftruncate清除文件,但fwrite添加了'nul'。 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); 谢谢!

3 个答案:

答案 0 :(得分:1)

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

之后,如有必要,您可以拨打 ftruncate

答案 1 :(得分:1)

您是否考虑过'c'或'c +'模式而不是'w'?

作为PHP manual says

  

'c'如果需要获得咨询锁定,这可能很有用(请参阅   flock())在尝试修改文件之前,就像使用'w'一样   在获取锁之前截断文件(如果截断为   在请求锁定后,可以使用ftruncate()。

UPD:至于上面发布的代码:

我已经尝试过你的代码并在文件开头看到了空值。 但是,当我添加

 fseek($fn, 0);

 ftruncate($fn, 0);

一切都很顺利(没有fseek,0正在追加)

答案 2 :(得分:0)

fopen($fn, 'c+'); // open the files in read / write, doesn't truncate on opening
fread($fn);
ftruncate($fn, 0);