文件處理系統(tǒng)

  • php是以UNIX文件系統(tǒng)為模型的竖慧,因此在windows系統(tǒng)中我們只能獲得“file”疲吸,“dir”或者“unknown”三種文件類型。而在UNIX系統(tǒng)中狮惜,我們可以獲得“block”高诺,“char”,“dir”碾篡,“fifo”虱而,“file”,“l(fā)ink”七種類型
filetype()         --此函數(shù)可以判斷文件類型

常用的文件屬性處理函數(shù)

file_exists()      --檢查目錄或文件是否存在
filesize()         --取得文件大小开泽,返回的是字節(jié)數(shù)
is_readable()      --判斷給定的文件是否可讀
is_writable()      --判斷給定的文件是否可寫
is_executable()    --判斷給定的文件是否可執(zhí)行
filectime()        --獲取文件的創(chuàng)建時(shí)間
filemtime()        --獲取文件的修改時(shí)間
fileatime()        --獲取文件的訪問時(shí)間
stat()             --獲取文件的大部分屬性牡拇,返回?cái)?shù)組

1.目錄的基本操作

在windows中默認(rèn)使用“\”作為路徑分隔符
在UNIX系統(tǒng)中使用“/”作為路徑分隔符
當(dāng)然windows也接受使用“/”作為分隔符,所以為了程序的可移植性穆律,建議都使用“/”作為分隔符惠呼,另外PHP的內(nèi)置常量DIRECTORY_SEPARTOR,其值為當(dāng)前系統(tǒng)的默認(rèn)文件路徑分隔符。

basename()    --返回路徑中的文件名部分
dirname()     --返回路徑中的目錄部分峦耘,和樓上相反
pathinfo()    --返回一個(gè)關(guān)聯(lián)數(shù)組其中包括指定路徑中的目錄名剔蹋、基本名和擴(kuò)展名三個(gè)部分
建立和刪除目錄
mkdir()    --建立一個(gè)新目錄
rmdir()    --只能刪除一個(gè)空目錄
unlink()   --刪除一個(gè)文件

可以自定義一個(gè)函數(shù)使用遞歸方法刪除一個(gè)非空目錄

function  delDir($directory){
    if (file_exists($directory)) {
       if ($dir_handle = @opendir($directory)) {
         while ($filename = readdir($dir_handle)) {
           if ($filename != "." && $filename != "..") {
             $subFile = $directory.'/'.$filename;
             if (is_dir($subFile))
                delDir($subFile);
             if (is_file($subFile))
                unlink($subFile);
           }
         }
         closedir($dir_handle);
         rmdir($directory);
       }
    }
}
統(tǒng)計(jì)目錄大小

自定義函數(shù)使用遞歸方法

function dirSize($directory) {
  $dir_size = 0;
  if ($dir_handle = @opendir($directory)) {
    while ($filename = readdir($dir_handle)) {
      if ($filename != '.' && $filename != '..') {
        $subFile = $directory.'/'.$filename;
        if (is_dir($subFile))
          $dir_size +=   dirSize($subFile);
        if (is_file($subFile))
          $dir_size +=  filesize($subFile);
      }
    }
    closedir($dir_handle);
    return $dir_size;
  }
}

2.文件的基本操作

基本的操作函數(shù)
fclose()      --關(guān)閉已打開的文件資源
fopen()       --打開一個(gè)文件,第一個(gè)參數(shù)需要被打開文件的URL辅髓,  第二個(gè)參數(shù)需要提供文件模式
copy(來源文件泣崩,目的文件)          --復(fù)制文件
unlink(目標(biāo)文件)                 --刪除文件
ftruncate(目標(biāo)文件資源,截取長度)      --將文件截取到指定的長度
rename(舊文件名洛口,新文件名)             --重命名文件名或者目錄   

文件模式如下:

模式字符 描述
r 只讀矫付,從文件開頭
r+ 讀寫,從文件開頭
w 只寫第焰,從文件開頭技即,如果文件存在,清空文件內(nèi)容
w+ 讀寫樟遣,從文件開頭而叼,如果文件存在,清空文件內(nèi)容
x 創(chuàng)建并以寫入方式打開豹悬,從文件開頭葵陵。如果文件存在返回false,僅用于本地文件
x+ 創(chuàng)建并以讀寫方式打開瞻佛,從文件開頭脱篙。如果文件存在返回false,僅用于本地文件
a 只寫伤柄,從文件末尾追加
a+ 讀寫绊困,從文件末尾追加
b 二進(jìn)制模式打開,用于與其他模式進(jìn)行連接
t 文本模式打開文件
文件寫入
fwrite(resource handle,string string[,int length])     --執(zhí)行后返回寫入的字符數(shù)

file_put_contents()        --直接將數(shù)據(jù)寫入指定的文件中适刀,不過會(huì)清空之前的內(nèi)容
讀取文件內(nèi)容
fread()               --讀取打開的文件秤朗,第二個(gè)參數(shù)可設(shè)置讀取多少字節(jié)
file_get_contents     --將文件讀入到字符串
fgets()               --從打開的文件中返回一行
fgetc()               --從打開的文件中返回字符串
readfile()            --讀取一個(gè)文件,并輸出到輸出緩沖
移動(dòng)文件指針
ftell()        --返回文件指針到當(dāng)前位置
fseek()        --移動(dòng)文件指針到指定位置
rewind()      --移動(dòng)文件指針到文件的開頭
使用這些函數(shù)時(shí)笔喉,必須提供一個(gè)用fopen打開的取视,合法的文件指針。
函數(shù)ftell()獲取文件當(dāng)前位置的指針偏移量常挚;
函數(shù)rewind()將文件指針移回到文件的開頭作谭;
而函數(shù)fseek()則將指針移動(dòng)到第二個(gè)參數(shù)offset指定的位置,如果沒有提供第三個(gè)參數(shù)whence奄毡,
則位置將設(shè)定為從文件開頭的offset字節(jié)處折欠。否則,第三個(gè)參數(shù)whence可以設(shè)置為三個(gè)可能的值吼过,
它將影響指針的位置锐秦。
文件的鎖定機(jī)制

在PHP中提供了flock() 函數(shù),可以對(duì)文件使用鎖定機(jī)制那先。當(dāng)一個(gè)進(jìn)程在訪問文件時(shí)加上鎖农猬,其他進(jìn)程想要對(duì)該文件進(jìn)行訪問,則必須等到鎖定被釋放之后售淡,這樣就可以避免在并發(fā)訪問同一個(gè)文件時(shí)破壞數(shù)據(jù)斤葱。

bool flock( int handle, int operation [,int &wouldblock] )      --輕便的咨詢文件鎖定
第一個(gè)函數(shù)必須是一個(gè)已經(jīng)打開的文件資源,
第二個(gè)參數(shù)operation也是必須的揖闸,規(guī)定使用哪種鎖定類型揍堕。operation可以是以下值之一:
   >LOCK_SH取得共享鎖定(從文件中讀取數(shù)據(jù)時(shí)使用)
   >LOCK_EX取得獨(dú)占鎖定(從文件中寫入數(shù)據(jù)時(shí)使用)
   >LOCK_UN釋放鎖定(無論共享或獨(dú)占鎖,都用它釋放)
   >LOCK_NB附加鎖定(如果不希望flock()在鎖定時(shí)堵塞汤纸,則應(yīng)在上述鎖定后加上該鎖)
如果鎖定會(huì)堵塞的話(已經(jīng)被flock()鎖定的文件衩茸,再次鎖定時(shí),flock()函數(shù)會(huì)被掛起贮泞,
這時(shí)稱為鎖定堵塞)楞慈,也可以將選定的第三個(gè)參數(shù)設(shè)置為1幔烛,則當(dāng)進(jìn)行鎖定時(shí)會(huì)阻擋其他進(jìn)程。

文件的上傳和下載

文件上傳
  • 客戶端上傳設(shè)置
    文件上傳的最基本方式是使用html表單選擇本地文件進(jìn)行提交囊蓝,在form表單中可以通過<input type="file">標(biāo)記選擇本地文件饿悬。如果文件支持上傳操作,必須在<form>標(biāo)簽中將enctype和method兩個(gè)屬性指明相應(yīng)的值聚霜,如下所示:
<html>
  <head>
    <meta charset="utf-8">
    <title>文件上傳</title>
  </head>
  <body>
    <form class="" action="upload.php" method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="10000000">
        選擇文件:<input type="file" name="myfile">
        <input type="submit" name="" value="上傳文件">
    </form>
  </body>
</html>
  • 在服務(wù)器端通過PHP處理上傳
    上傳文件接收和后續(xù)處理就要通過php來處理狡恬。想要通過php成功的管理文件上傳。需要通過以下三方面信息蝎宇。如下所示:

    》 設(shè)置PHP配置文件中的指令: 用于精細(xì)的調(diào)節(jié)PHP的文件上傳功能弟劲。
    》$_FILES多維數(shù)組: 用于儲(chǔ)存各種與上傳文件相關(guān)的信息,其他數(shù)據(jù)還使用$_POST去接收姥芥。
    》PHP的文件上傳處理函數(shù):用于上傳文件的后續(xù)處理兔乞。

PHP配置文件中與文件上傳有關(guān)的選項(xiàng)

指令名 默認(rèn)值 功能描述
file_uploads ON 確定PHP腳本是否接收HTTP文件上傳
upload_max_filesize 2M 限制PHP處理上傳文件大小的最大值,此值必須小于post_max_size值
post_max_size 8M 限制通過POST方法可以接受信息的最大值撇眯,此值應(yīng)當(dāng)大于配置指令upload_max_file的值报嵌,因?yàn)槌松蟼鞯奈募猓€可能傳遞其他的表單域
upload_tmp_dir NULL 上傳文件存放的臨時(shí)路徑熊榛,可以是一個(gè)絕對(duì)路徑锚国。

全局?jǐn)?shù)組$_FILES中的元素說明

數(shù)組 描述
$FILES["myfile"]["name"] 客戶端機(jī)器文件的原名稱,包含擴(kuò)展名
$FILES["myfile"]["size"] 已上傳文件的大小玄坦,單位是字節(jié)
$FILES["myfile"]["tmp_name"] 文件被上傳后血筑,在臨時(shí)目錄中的文件名
$FILES["myfile"]["error"] ● 0 - 表示沒有任何錯(cuò)誤,文件上傳成功煎楣;
● 1 -表示 大小超過了配置文件中upload_max_filesize選項(xiàng)限制的值豺总;

● 2 -表示上傳文件大小超過了HTML表單設(shè)置的最大值;
● 3 -文件只有部分被上傳择懂;
● 4 -沒有上傳任何文件
$FILES["myfile"]["error"] 獲取上傳文件的類型喻喳,比如是圖片,視頻困曙,等等

上表中$_FILES數(shù)組的第一維“myfile”表伦,代表的是上傳表單元素(<input type="file" name="myfile">)中的name屬性的值,另外php還有兩個(gè)專門用于文件上傳所使用的函數(shù)

is_uploaded_file(string filename)   //判斷指定的文件是否是通過HTTP POST上傳的慷丽,函數(shù)的參數(shù)必須是指定類似于$FILES["myfile"]["tmp_name"] 的變量蹦哼,才能判斷指定的文件缺失是上傳文件
move_uploaded_file()      //將上傳的文件移動(dòng)到新位置,雖然函數(shù)copy()和函數(shù)move() 同樣好用要糊,但是move_uploaded_file()  提供了一種額外的功能纲熏,就是判斷第一個(gè)參數(shù)filename指定的文件,是否是合法的上傳文件。如果不是則不會(huì)移動(dòng)文件并且返回false
文件下載

簡單的下載就像這樣:

<a >下載文件</a>

一行代碼直接搞定局劲,
當(dāng)然勺拣,為了提高安全性,當(dāng)然要逼格高一點(diǎn)類似下面這樣

header('Content-Type:image/gif;);
header('Content-Disposition:attachment;filename="test.gif"');
header('Content-Length:3390');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末容握,一起剝皮案震驚了整個(gè)濱河市宣脉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剔氏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹祷,死亡現(xiàn)場離奇詭異谈跛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)塑陵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門感憾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人令花,你說我怎么就攤上這事阻桅。” “怎么了兼都?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嫂沉,是天一觀的道長。 經(jīng)常有香客問我扮碧,道長趟章,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任慎王,我火速辦了婚禮蚓土,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赖淤。我一直安慰自己蜀漆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布咱旱。 她就那樣靜靜地躺著确丢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莽龟。 梳的紋絲不亂的頭發(fā)上蠕嫁,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音毯盈,去河邊找鬼剃毒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赘阀。 我是一名探鬼主播益缠,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼基公!你這毒婦竟也來了幅慌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤轰豆,失蹤者是張志新(化名)和其女友劉穎胰伍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酸休,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骂租,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斑司。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渗饮。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宿刮,靈堂內(nèi)的尸體忽然破棺而出互站,到底是詐尸還是另有隱情,我是刑警寧澤僵缺,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布胡桃,位于F島的核電站,受9級(jí)特大地震影響谤饭,放射性物質(zhì)發(fā)生泄漏标捺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一揉抵、第九天 我趴在偏房一處隱蔽的房頂上張望亡容。 院中可真熱鬧,春花似錦冤今、人聲如沸闺兢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屋谭。三九已至,卻和暖如春龟糕,著一層夾襖步出監(jiān)牢的瞬間桐磁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工讲岁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留我擂,地道東北人衬以。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像校摩,于是被迫代替她去往敵國和親看峻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 文件系統(tǒng)概述 文件的類型 在程序運(yùn)行時(shí)衙吩,程序本身和數(shù)據(jù)一般都存在內(nèi)存中互妓,當(dāng)程序運(yùn)行結(jié)束后,存放在內(nèi)存中的數(shù)據(jù)被釋放...
    dptms閱讀 1,008評(píng)論 0 1
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒坤塞。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,369評(píng)論 0 20
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒冯勉。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解包。 uni...
    思?jí)鬚HP閱讀 1,984評(píng)論 1 24
  • php.ini設(shè)置,上傳大文件: post_max_size = 128Mupload_max_filesize ...
    bycall閱讀 6,763評(píng)論 3 64
  • PHP 學(xué)習(xí)目錄 ├─PHP視頻教程 1 LAMP網(wǎng)站構(gòu)建 │ ├─PHP教程 1.1.1 新版視頻形式介紹│ ...
    曹淵說創(chuàng)業(yè)閱讀 16,156評(píng)論 29 417