技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運營

贊助商

分類目錄

贊助商

最新文章

搜索

路徑和權(quán)限問題導(dǎo)致fopen() 創(chuàng)建和寫入文件失敗

作者:admin    時間:2013-6-6 10:7:59    瀏覽:

本人一直使用的是asp和.net環(huán)境,php比較少使用。如果用asp或asp.net來進行文件操作,我還是比較有經(jīng)驗的。今天由于需要,我得在php環(huán)境下做一次文件的讀寫操作,這對于我來說還是第一次。

雖然在寫程序時信心十足,但是當運行起來時卻發(fā)現(xiàn)沒那么簡單。

路徑問題導(dǎo)致fopen() 創(chuàng)建和寫入文件失敗

首先是在本地測試程序,程序如下:

<?php
$fileDir = '/phpDemo/fopen.txt';
$str ='testing';
$h = fopen($fileDir,'w+');
 if(fwrite($h,$str))
 {
  echo '文件寫入成功';
 }
 fclose($h);
?>

但卻沒有執(zhí)行成功,提示“failed to open stream: No such file or directory ”,即是文件路徑不對,問題應(yīng)該是這句

$fileDir = '/phpDemo/fopen.txt';

我改為

$fileDir = '../phpDemo/fopen.txt';

終于成功了。

不過,上述的相對路徑的寫法,不是我的習(xí)慣,我比較喜歡用絕對路徑。查了下,我發(fā)現(xiàn)可以用如下方式來寫文件的路徑:

$RootDir = $_SERVER['DOCUMENT_ROOT'];
$fileDir = $RootDir.'\phpDemo\fopen.txt';

這個方法是首先定義了根目錄,再寫出文件的絕對路徑,更通用,也方便管理。

不可忽視的權(quán)限問題

本地測試通過,原以為上傳到空間后會很順利,誰知竟然不成功!是什么新的問題又出現(xiàn)了?

根據(jù)提示,是沒有權(quán)限。

原來,空間里的目錄寫權(quán)限沒有打開。這個已經(jīng)不是php的問題了。

知識擴充

fopen

fopen — 打開文件或者URL。

格式:

fopen(string $filename , string $mode)

fopen() 將 filename 指定的名字資源綁定到一個流上。

filename可以是一個本地文件,也可以是一個URL。

如果filename 指定的是一個本地文件,該文件必須是 PHP 可以訪問的,并且文件訪問權(quán)限允許該訪問。

如果filename 指定的是一個URL,PHP 將檢查并確認 allow_url_fopen 已被激活。如果關(guān)閉了,PHP 將發(fā)出一個警告,而 fopen 的調(diào)用則失敗。(fopen()和file_get_contents()打開URL獲得網(wǎng)頁內(nèi)容的用法區(qū)別

fopen() 中 mode 的可能值列表

mode 說明
'r' 只讀方式打開,將文件指針指向文件頭。
'r+' 讀寫方式打開,將文件指針指向文件頭。
'a' 寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
'a+' 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
'w' 寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
'w+' 讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。

返回值

成功時返回文件指針資源(如何調(diào)用fopen()打開的資源),如果打開失敗,本函數(shù)返回 FALSE。

錯誤/異常

如果打開失敗,會產(chǎn)生一個 E_WARNING 錯誤。可以通過 @ 來屏蔽錯誤。

有時我們會看到,fopen中mode值包含一個“b”字符,例如“wb”,這是怎么回事呢?

這是因為:

不同的操作系統(tǒng)家族具有不同的行結(jié)束習(xí)慣。當寫入一個文本文件并想插入一個新行時,需要使用符合操作系統(tǒng)的行結(jié)束符號?;?Unix 的系統(tǒng)使用 \n 作為行結(jié)束字符,基于 Windows 的系統(tǒng)使用 \r\n 作為行結(jié)束字符,基于 Macintosh 的系統(tǒng)使用 \r 作為行結(jié)束字符。

如果寫入文件時使用了錯誤的行結(jié)束符號,則其它應(yīng)用程序打開這些文件時可能會表現(xiàn)得很怪異。

Windows 下提供了一個文本轉(zhuǎn)換標記('t')可以透明地將 \n 轉(zhuǎn)換為 \r\n。與此對應(yīng)還可以使用 'b' 來強制使用二進制模式,這樣就不會轉(zhuǎn)換數(shù)據(jù)。要使用這些標記,要么用 'b' 或者用 't' 作為 mode 參數(shù)的最后一個字符。

默認的轉(zhuǎn)換模式依賴于 SAPI 和所使用的 PHP 版本,因此為了便于移植鼓勵總是指定恰當?shù)臉擞洝H绻遣僮骷兾谋疚募⒃谀_本中使用了 \n 作為行結(jié)束符,但還要期望這些文件可以被其它應(yīng)用程序例如 Notepad 讀取,則在 mode 中使用 't'。在所有其它情況下使用 'b'。

在操作二進制文件時如果沒有指定 'b' 標記,可能會碰到一些奇怪的問題,包括壞掉的圖片文件以及關(guān)于 \r\n 字符的奇怪問題。

為移植性考慮,強烈建議在用 fopen() 打開文件時總是使用 'b' 標記。

標簽: fopen  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */