2012-09-20 61 views
1

Goodmorning everyone。
我有點卡住了。有沒有辦法打開一個文件,並只在某些條件下清空它?fopen和空文件只在某些條件下

我要的是:
1的fopen(文件) - >羊羣 - >讀取文件的內容
2.如果滿足某些條件,替換該文件的內容
3.解鎖並FCLOSE
的問題是:
fopen (file, w+)清空文件事前,所以如果我想寫信給它

我在combinati試圖ftruncate($fn,0)我不能閱讀的內容
fopen (file, r+)不清空文件在r+上,但是向文件寫入'null'
解決方法是首先讀取文件內容,然後將其打開。但是我從閱讀的那一刻開始直到我完成了嘗試保持該文件的鎖定。
任何任何想法?

編輯:
問題似乎是fwriteftruncate清除文件,但fwrite添加了'nul'。 100次通過後,有與fseek($fn, 0); 由於解決了數據

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

前面有一百個「NUL」!

+0

1.鎖2.讀3.寫在必要時前 – zerkms

+0

在讀取文件後有條件調用'ftruncate'有什麼問題? – Jon

+0

問題是3。fopen(r +)不會重新顯示內容,但會添加 – Michel

回答

1

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

由於PHP manual says

「C」,如果它希望得到一個諮詢鎖(見 羊羣())試圖修改該文件之前,如使用「W」能 截斷,這可能是有用的獲得鎖之前的文件(如果截斷爲 ,則可在請求鎖之後使用ftruncate())。

UPD:至於上面貼的代碼:

我曾嘗試你的代碼,看到空的文件的開頭。 然而,當我加入

fseek($fn, 0); 

ftruncate($fn, 0); 

一切正常(無FSEEK,0的被追加)

+0

我試過了。問題是清空文件。 w +給我一個不錯的空文件 ftruncate($ fn,0)以某種方式將'nul'寫入文件。 – Michel

+0

@Michel剛剛在我的本地機器上嘗試過。我的測試使文件大小。你確定你沒有向文件寫入一個空變量嗎?你能發佈與問題相關的php代碼嗎? –

+0

不,它不寫入空值: '<?php file_put_contents('1.txt','some text'); var_dump(file_get_contents('1.txt')); //將打印字符串(9)「some text」; $ f = fopen('1.txt','c +'); ftruncate($ f,0); fclose($ f); var_dump(file_get_contents('1.txt')); //將打印字符串(0)「」; ' – irezvin

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

之後,你可以在必要時調用ftruncate

+0

它不會工作。如果文件在拼音模式下打開,'fseek'不起作用 –

+0

是的,剛纔注意到了。謝謝你糾正我。 – Vlad

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

我試過了。問題是清空文件。 w +給了我一個不錯的空文件,ftruncate($ fn,0)以某種方式將'nul'寫入文件。每次我通過文件通過功能,它增加了一個'nul',留給我一個不斷增長的文件:-) – Michel