2012-12-18 110 views
3

我試圖創建一個腳本,將檢查文件是否寫它,檢查文件是否

確保腳本不會過早退出之前是寫在寫入之前是可寫的。

我已經得到了這麼遠

$meta =stream_get_meta_data($file); 
while(!is_writable($meta['uri'])){ 
    sleep(rand(0,3)); 
    $meta=stream_get_meta_data($file); 
    echo("sleeping\n"); 
} 
$csv = fopen($file, 'a+')or die("can't open file"); 

當我測試與$文件被關閉,即使在睡覺的一部分$文件打開,它會阻止腳本。

我對PHP相當陌生,所以可能有一個處理範例,我不知道。

任何幫助將是非常受歡迎的。

編輯:我進入while循環的原因是不斷檢查文件是否打開。因此,一旦文件最終可寫,它應該只能退出while循環。

睡眠只是爲了複製試圖打開文件的人。

回答

1
is_writable(<your_file>) 

這應該有訣竅嗎?

http://www.php.net/manual/en/function.is-writable.php

-

您也可以使用

@fopen(<your_file>, 'a') 

如果返回錯誤,文件沒有writiable

+2

ahh not @ ...它不是一個好主意 –

+0

@nullPoiиteя當is_writable返回false時,即使在可寫的文件上,「@ fopen」方法並不是那麼糟糕。 – srcspider

1

is_writable (string $filename)

$filename = 'test.txt'; 
if (is_writable($meta['uri']) { 
    echo 'The file is writable'; 
} else { 
    echo 'The file is not writable'; 
} 
+0

謝謝,雖然我想保持這段時間,因爲我需要不斷檢查它,直到fie變得可寫。 –

0

你可能不應該使用while循環來檢查文件是否可寫。也許更改代碼周圍有點是這樣的:

$meta =stream_get_meta_data($file); 

if (is_writable($file)){ 
    sleep(rand(0,3)); 
    $meta=stream_get_meta_data($file); 
    echo("sleeping\n"); 
} 

$csv = fopen($file, 'a+')or die("can't open file"); 

然而,因爲我不知道你的主要目標是,你可以做這樣的東西:

$meta =stream_get_meta_data($file); 

while(!is_writable($file)){ 
    sleep(rand(0,3)); 
    $meta=stream_get_meta_data($file); 
    echo("sleeping\n"); 
} 

$csv = fopen($file, 'a+')or die("can't open file"); 
+0

謝謝,我已經嘗試了第二個選項,但即使$文件已打開,它將退出while循環,然後退出fopen,因爲該文件仍處於打開狀態 –

+0

其原因是我必須從元數據中提取元數據文件第一,然後對該文件進行寫入檢查 –

+0

這個文件是否是你的開頭文件,你只需要確保你有獨佔訪問權限?如果是這樣可能http://php.net/manual/en/function.flock.php可以幫助 – PhearOfRayne

0

使用touch()

if (touch($file_name) === FALSE) { 
    throw new Exception('File not writable'); 
}