PHP 檔案系統詳解_PHP教程

來源:互聯網
上載者:User
檔案處理函數
1.檔案操作.
  開啟檔案:
    開啟指定的檔案時會返回相應的對象,若不存在指定的檔案,那麽可能會自動建立這個檔案。
    resource fopen(string filename,string mode [,int use_include_path][,resource context]);
      filename 可以是包含檔案路徑的檔案名稱,也可以是某種協議給出的URL(開啟遠程檔案).為了避免系統切換帶來的麻煩,採用'/'作為路徑分隔字元.
      mode: 設定開啟檔案的方式,分別有:
           r:唯讀模式,檔案指標位於檔案頭部.
           r+:唯讀模式----讀/寫入模式,檔案指標位於頭部檔案.注意可能產生覆蓋.
           w:唯寫模式,檔案指標位於檔案頭部.如果檔案存在,刪除內容重寫;否則,自行建立檔案.
           w+:唯寫模式----讀寫檔案,讀/寫檔案指標指向檔案頭部.如果檔案存在,刪除內容重寫;否則,自行建立檔案.
           x:謹慎寫----寫入模式開啟檔案,從檔案頭部開始寫如.如果檔案存在,返回false,產生一個E_WARNING層級的錯誤資訊
           x+:謹慎寫---讀寫入模式代開檔案.如果檔案存在,返回false,產生一個E_WARNING層級的錯誤資訊
           a:追加,檔案指標指向檔案尾部.如果檔案存在,則直接在檔案尾追加;否則,自行建立檔案.
           a+:追加,檔案指標指向檔案尾部.如果檔案存在,則直接在檔案尾追加或者讀取;否則,自行建立檔案.
           b:二進位模式.用於與其他模式進行連結.(windows 下的選項)
           t: 用於與其他模式進行結合.(windows 下的選項)
    請慎用fopen()函數,因為一不小心就有可能將檔案刪除掉.同時,不同的作業系統具有不同的行結束習慣(UNIX:\n Windows:\r\n Macinitosh:\r).如果錯誤的使用行結束符,那麼當開啟檔案時,可能輸出一堆亂碼.以上可以通過"'t'","'b'"來避免.
讀取檔案:
  string fgetc(resource handle);//返回從handle指向的檔案中的一個字元.如果遇到EOF,則返回false;
  string fgets(int handle[,int length]);//從檔案指標指向的位置擷取一行字元,並且返回最大為length-1個位元組的字串..檔案指標必須有效,且指向一個由fopen()或fsockopen()成功開啟的檔案.length表示讀取的資料的長度.在遇到換行,EOF,或者指定length時結束.忽略length將讀到行結束.
  string fgetss(resource handle[,int length][,string allowable_tags]);//讀取一行,且過濾掉html,php標記.
  string fread(int handle,int length);//從檔案中讀取任意長度的資料。,還可以用於讀取二進位檔案。handle 為指向檔案的資源,length 讀取length個位元組或者遇到EOF時停止執行。
例子:
複製代碼 代碼如下:
$filename="./files.text";
$fp=fopen($finename,"rb");
$encho fread($fp,100);
?>

readfile(),file()和file_get_contents()函數.
readfile(),file()和file_get_contents()函數.
  int readfile(string filename[,bool use_include_path,resource context]);//讀取一個檔案並寫入到緩衝區,如果成功,則返回讀取的位元組數,否則返回false。filename檔案名稱。參數use_include_path控制是否支援在include_path中搜尋檔案,true為支援。使用readfile函數不需要開啟/關閉檔案。
  array file(string filename [,bool use_include_path[,resource context]]);//將整個檔案的內容讀取到數組中。如果成功,返回數組,數組中的每個元素都是檔案中對應的一行,包活分行符號在內;否則返回false;
  string file_get_contents(string filename[,bool use_include_path[,resource context[,int offset[,int maxlen]]]]);//context 為5.0新增的內容,可以用NULL來忽略。offset,maxlen為5.1的的內容。offset 用於標記檔案啓始的位置,maxlen 設定檔案讀取的長度。該方法適用於二進位檔案的讀取。是將檔案內容讀入到一個字串的首選方法。如果作業系統支援,還會使用記憶體映射技術來增強效能。如果開啟有特殊字元的URL(例如存在空格),那麽要使用urlencode()來進行URL編碼。

備忘:readfile(),file()和file_get_contents()在讀取整個檔案夾中的內容時,不需要使用fopen()和fclose()函數,但是在讀取一個字元,一行字元和任意長的字元時則必須使用。

2.寫入檔案:
    int fwrite(resource handle,string[,int length]);//執行檔案的寫入操作,它還有一個別名fputs().該方法用於把string的內容寫入檔案指標handle處。如果設定length,那麽寫入length個位元組或者完成string寫入後,操作就會停止。成功寫入則返回true,否則返回false。
備忘:若給出length參數,那麽php.ini檔案中的magic_quotes_runtime選項將會被忽略,而string中的斜線將不會被抽去。區分二進位檔案和文字檔系統則在開啟檔案時fopen()函數的mode參數要加上‘b'。
   int file_put_contents(string filename,string data[.int flags[,resource context]]);//將一個字串寫入檔案中,如果成功則返回位元組數,否則返回false。flags:實現對檔案的鎖定(選項有 file_use_include_path,file_append:追加,lock_ex:獨佔鎖定)。context一個context資源。
備忘:fwrite()雖然具備寫入檔案的功能,但是必須有fopen()和fclose()函數的支援。file_put_contents()整合了fopen(),fwrite(),fclose()功能,可以單獨完成檔案的寫入。
3.關閉檔案
  檔案有開啟就應該有關閉功能,對檔案的操作結束後,應該關閉這個檔案,否則可能引起錯誤。
  bool fclose(resouce handle);//將參數handle指向的檔案關閉,如果成功則返回true,否則返回false。

鎖定檔案
  在向一個文字檔中寫入資料的時候,需要先鎖定檔案,已防止其他使用者同時也修改此檔案的內容。php中通過flock()函數實現檔案的鎖定。
   bool flock(int handle ,int operation);//參數operation控制鎖定許可權。包括:lock_sh:取得共用鎖定定(讀取程式)。lock_ex:取得獨佔鎖定(寫入)。lock_un:釋放鎖定。lock_nb:防止flock()函數在鎖定時堵塞。

目錄處理函數
  目錄是一種特殊的檔案。既然是檔案,如果對其進行操作,同樣必須先開啟,然後才可以進行瀏覽操作,最後還要記得關閉。

1.開啟目錄

  開啟指定的目錄檔案,若果成功,則返回目錄的控制代碼。否則返回false。與開啟檔案不同的是,若目錄不存在,它並不會自動建立目錄,而是拋出一個錯誤資訊。通過在opendir()函數前加“@”符號,可以屏蔽錯誤資訊的輸出。
  resource opendir(string path[,resource context]);//path指定要開啟的目錄檔案。如果path指定的不是一個有效目錄,或者因為許可權問題,檔案系統錯誤不能開啟,那麽該函數將會返回false,並且產生一個E_WARNING層級的錯誤資訊。

2.瀏覽目錄


 利用opendir函數返回的控制代碼配合scandir函數實現瀏覽操作。
  array scandir(string directory[,int sorting_ordering[,resource context]]);//用於瀏覽指定路徑下的目錄和檔案。如果成功則返回包含檔案名稱的array,否則返回false。directory指定要瀏覽的目錄,如果不是目錄,那麽將返回false,並且產生一個E_WARNING層級的錯誤資訊。sorting_order設定排列順序,預設為字母升序排列。如果帶上該參數,則變為降序排列。
備忘:is_dir()函數,判斷指定檔案名稱是否一個目錄。如果檔案名稱存在且為目錄,則返回true,否則返回false。如果是相對目錄,則按照當前工作目錄檢查其相對路徑。

3.關閉目錄。

  void closedir(resource handle);//handle,要關閉的工作目錄的控制代碼。

備忘:前面已經瞭解到,若開啟的目錄不存在,系統並不會幫我們建立目錄。那麽我們可以自行建立想要的目錄。可以應用以下函數:
    mkdir()函數:建立一個目錄,成功則返回true,否則false。
    rmdir()函數:刪除目錄。目錄必須為空白(目錄中無檔案或者子目錄),且要有操作的許可權。
    unlink()函數:刪除檔案,成功則返回true,失敗返回false。

檔案上傳、下載原理 
       
步驟內容:
  步驟1:控制上傳檔案,通過php.ini檔案配置。
  步驟2:對上傳檔案進行判斷。上傳檔案的大小,格式等。
  步驟3:執行上傳檔案的操作方法。

1.控制上傳檔案:

  php通過對php.ini對上傳檔案進行控制,包括:是否支援上傳、上傳檔案的臨時目錄、上傳檔案的大小、指令執行的時間與指令分配的記憶體空間。
    在php.ini檔案中定位到file uploads選項,完成對上述選項的設定。選項含義如下:
    file_uploads:如果是on,說明伺服器支援檔案上傳,如果為off,則不支援。一般預設是支援的,此選項不必修改。
    upload_tem_dir:上傳檔案的臨時目錄。在檔案上傳成功之前,檔案首先儲存在伺服器的臨時目錄中。多數使用系統預設目錄,但是也可以自行設定。
    upload_max_filesize:伺服器允許上傳檔案的最大值,以MB為單位。系統預設為2MB,若超過則須修改其值。
    max_execution_time:php中一個指令所能執行的最長時間,單位是秒。該指令在執行上傳超大檔案時必須修改,否則及時上傳檔案在伺服器允許的範圍內,但是超過指令所能執行的最長時間,仍然無法實現上傳。
    memory_limit:php中一個指令所分配的記憶體空間,單位時MB。它的大小同樣會影響到超大檔案的上傳。

備忘:在用戶端中控制上傳檔案應用的時form表單中的enctype和method屬性,以及隱藏欄位MAX_FILE_SIZE.
    enctype="multipart/form-data":指定表單編碼資料方式。
    method="post":指定資料轉送的方式。
    :通過隱藏欄位控制上傳檔案的大小,單位為位元組。該值不能超過php.ini設定檔中的upload_max_filesize選項設定的值。它不能完全控制上傳檔案的大小,只能避免一些不必要的麻煩。

2.判斷上傳檔案

  對上傳檔案進行判斷應用的是全域變數$_FILES,$_FILES是一個數組,它包含所有上傳檔案的資訊。數組中各個元素含義如下:
    $_FILES[filename][name]:儲存上傳檔案的檔案名稱,如text.txt,title.jpg等。
    $_FILES[filename][size]:隱藏檔的大小,單位為位元組。
    $_FILES[filename][tem_name]:隱藏檔在臨時目錄中使用的檔案名稱,因為檔案在上傳時首先要將其以臨時檔案的身份儲存在臨時目錄中。
    $_FILES[filename][type]:儲存上傳檔案的MIME類型。MIME規定各種檔案格式的類型,每種MIME類型都時由“/”分隔的主類型和子類型組成。例如:"image/gif"的主類型為映像,子類型為GIF格式的檔案。"text/html"代表文本的HTML檔案。
    $_FILES[filename][error]:隱藏檔上傳的錯誤碼:此項目為PHP4.2.0版本中新增內容。它的傳回值由5種:
      0:表示沒有任何錯誤。檔案上傳成功。
      1:表示上傳檔案的大小超出設定檔指令upload_max_filesize選項的限定值。
      2:表示上傳檔案的大小超出HTML表單中max_file_size選項所指定的值。
      3:表示檔案只被上傳了一部分。
      4:表示沒有上傳任何檔案。
例子:
複製代碼 代碼如下:
/*判斷是否由上傳圖片*/
if(!empty($_FILES['up_picture'][name])){
/*將圖片資訊賦值給變數*/
$type=strtolower(strstr($_FILES['up_picture'][name],"."));
if($type != '.jpg' && $type != '.gif') echo "你上傳的檔案格式不對";
else{
if($_FILES['up_picture'][size]<2000000 && $_FILES['up_picture'][size]>0){
echo "上傳檔案名稱:".$_FILES['up_picture'][name]."
";
echo "上傳檔案類型:".$type."
";
echo "上傳檔案大小:".$_FILES['up_picture'][size]."
";
}else echo "圖片大小不符合要求。";
}
}
?>


3.檔案上傳。

  php中應用move_uploaded_file()函數實現檔案上傳。但在執行之前,為了防止潛在的攻擊對原本不能通過指令碼互動的檔案進行非法管理,可以先應用is_uploaded_file()函數判斷指定的檔案是否通過HTTP POST上傳的,如果是則返回true。通過該函數,可以確保惡意的使用者無法欺騙指令碼去訪問不能訪問的檔案。
   bool is_uploaded_file(string name);//用於判斷指定的檔案是否通過HTTP POST上傳的。filename必須類似於$_FILES[‘filename'][‘temp_name']的變數,不可以使用從用戶端上傳的檔案名稱$_FILES[‘filename'][‘name']。

   move_upload_file(string filename,string destination);//該函數用於將檔案上傳到伺服器中指定的位置。如果成功,則返回true,否則返回false。filename指定上傳檔案的臨時檔案名稱,即$_FILES['tmp_name'],參數destination指定檔案上傳後儲存的新路徑和名稱。如果參數不是合法的上傳檔案,不會出現任何操作,該函數將返回false。如果是合法的上傳操作,但是由於某些原因無法移動,則不會出現任何操作,返回false的同時將會發出一條警告。
複製代碼 代碼如下:
if( !empty($_FILES[ 'up_picture' ][ 'name' ])){
if( $_FILES['up_picture']['error'] > 0){
echo "上傳錯誤!";
switch($_FILES['up_picture']['error']){
case 1:
echo "上傳檔案超出設定檔規定值";
break;
case 2:
echo "上傳檔案超出表單規定值";
break;
case 3:
echo "上傳檔案不全";
break;
case 4:
echo "沒有上傳檔案";
break;
}
}else{
if( ! is_dir('./upfile/') ) mkdir('./upfile/');
$path='./upfile/'.time().$_FILES['up_picture' ][ 'name' ];
if( is_uploaded_filed( $_FILES['up_picture' ][ 'tmp_name' ] )){
if(!move_uploaded_file( $_FILES['up_picture' ][ 'tmp_name' ] ,$path )){
echo "上傳失敗!";
}else{
echo "檔案".time().$_FILES['up_picture' ][ 'name' ] ."上傳成功,大小為:".$_FILES['up_picture' ][ 'size' ] ;
}
}else{
echo "上傳檔案".$_FILES['up_picture' ][ 'name' ]."不合法";
}
}
}
?>


4.檔案下載

這裡介紹通過http方式下載檔案,主要用到header()函數。header()函數屬於HTTP函數,其作用是以HTTP將HTML文檔的表頭送到瀏覽器,並告訴瀏覽器具體怎麽處理這個頁面。
void header(string string[,bool replace[,int http_respone_code]]);//參數string 指定發送的標題。參數replace控制如果一次發送多個標題,對於相似的標題是替換還是添加。如果是false,則強制發送多個同類型的標題,預設為true。參數http_respone_code強制將HTTP響應代碼設定為指定值:
下載步驟如下:
    a):通過"Content-Type" 指定檔案的MIME類型。
    b):通過"Content-Disposition" 對檔案進行描述,值"attachment;filename="test.jpg"" 說明是一個福建,同時指定下載檔案的名稱。
    c):通過"Content-Length" 設定下載檔案的大小。
d):通過readfile()函數讀取檔案內容。
例如:
複製代碼 代碼如下:
header('Content-Type:image/jpg');
header(' Content-Disposition:attachment;filename="test.jpg" ');
header('Content-Length:'.filesize('test.jpg') );
readfile('test.jpg');


5.訪問遠程檔案

  步驟1:配置 php.ini 檔案選項 allow_url_fopen設定為on。參數預設是開啓的,允許開啟http和ftp指定的遠程檔案。如果 allow_url_fopen設定為off,則不允許開啟遠程檔案。
  步驟2:使用fopen()函數讀取檔案內容。根據內容建立你想要的資源,儲存到本地。
        
ps:更多php.ini設定檔中的檔案操作 和 目錄操作的擴充方法請參考官方php指南。

http://www.bkjia.com/PHPjc/326004.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/326004.htmlTechArticle檔案處理函數 1.檔案操作. 開啟檔案: 開啟指定的檔案時會返回相應的對象,若不存在指定的檔案,那麽可能會自動建立這個檔案。 resource...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.