早安所有人。
我有点卡住了。有没有办法在某些条件下fopen文件并清空它?
我想要的是:
1. fopen(文件) - >羊群 - >阅读文件内容
2.如果满足某些条件,请替换文件的内容
3.解锁并关闭
问题是:
fopen (file, w+)
预先清空文件,因此无法阅读内容
如果我想写文件,fopen (file, r+)
不会清空文件
我已将ftruncate($fn,0)
与r+
结合使用,但将“null”写入文件
解决方法是先读取文件内容然后再打开它。但是我试着从阅读的那一刻开始对文件进行锁定直到我完成
任何想法?
编辑:
问题似乎是fwrite
。
ftruncate
清除文件,但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);
谢谢!
答案 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'?
'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);