亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

PHP之文件目錄基礎操作

添加時間:2014-11-29 17:41:17  添加: 思海網絡 
PHP臨時聲明的變量是保存在內存中的,即便是靜態變量,在腳本運行完畢后也會被釋放掉,so,想長久保存一個變量的內容,方法之一就是寫到文件中,放到硬盤或服務器上,為此文件操作就必須很熟悉。
 
     1.文件的屬性信息獲取
 
     首先文件具有類型,在Linux下邊,有block(塊設備,如磁盤分區、CD-ROM)、char(以字符為輸入的設備,如鍵盤、打印機)、dir(目錄類型,目錄也是文件的一種)、fifo(命名管道,解釋是將信息從一個進程傳到另一個進程)、file(普通的文件)、link(鏈接,類似win下邊的快捷方式)、unknow(未知類型)7大類,在win下邊,只有3類:file、dir和unknown。Linux渣表示一定要好好搞一下Linux-_-,人家完全是為Linux而生。
 
     關于類型的獲取有這么幾個函數:filetype:獲取類型; is_file:判斷為是否是正常文件; is_link:判斷是否是鏈接。
 
     關于屬性的獲取有這么幾個函數:
 
         file_exists:判斷文件或目錄是否存在;
 
         filesize:獲取文件大小;
 
         is_readable、is_writable、is_executable :是否可讀、可寫、可執行;
 
         filectime、filemtime、fileatime:獲取文件的創建時間(create)、修改時間(modify)、訪問時間(access),均返回時間戳;
 
         stat:獲取文件的一些基本信息,返回一個索引與關聯混合數組。
 
     比如,可以這樣判斷文件類型:
 
復制代碼
<?php
    function getFileType($path){   // 獲取文件類型
        switch(filetype($path)){
            case 'file': return 'ordinary file';
            case 'dir': return 'directory';
             case 'block': return 'block device file';
             case 'char': return 'transfer device base on char';
             case 'fifo': return 'named pipes';
             case 'link': return 'symbol link';
             default: return 'unknown type';
        }
    }
復制代碼
     filesize返回的是以字節為單位的數據,如果是大文件數字或很大,可以對數字先處理一下,代碼如下
 
復制代碼
<?php
    // 處理文件大小
    function getSize($path = '', $size = -1){
        if($path !== null && $size == -1){     // 只傳路徑就計算大小,也可以使之只處理數字   
             $size = filesize($path);
         }
          if($size >= pow(2, 40)){                    
             return round($size/pow(2, 40), 2).'TB';
          }
          else if($size >= pow(2, 30)){
             return round($size/pow(2, 30), 2).'GB';
          }
          else if($size >= pow(2, 20)){
             return round($size/pow(2, 20), 2).'MB';
          }
          else if($size >= pow(2, 10)){
             return round($size/pow(2, 10), 2).'KB';
          }
          else{
             return round($size, 2).'Byte';
          }
     }
復制代碼
    現在綜合來獲取一下文件信息,代碼如下:
 
復制代碼
<?php
    function getFileInfo($path){
         if(!file_exists($path)){     // 判斷文件是否存在
             echo 'file not exists!<br>';
             return;
         }
         
         if(is_file($path)){    // 是文件,打印基礎文件名
             echo basename($path).' is a file<br>';
         }
         
         if(is_dir($path)){    // 是目錄 ,返回目錄
             echo dirname($path).' is a directory<br>';
         }
         
         echo 'file type:'.getFileType($path).'<br>';  // 獲取文件類型
         echo 'file size:'.getSize($path).'<br>';  // 獲取文件大小
         
         if(is_readable($path)){   // 是否可讀
             echo basename($path).' is readable<br>';
         }
         if(is_writeable($path)){  // 是否可寫
             echo basename($path).' is writeable<br>';
         }
         if(is_executable($path)){  // 是否可執行
             echo basename($path).' is executable<br>';
         }
         // touch函數可以修改這些時間
         echo 'file create time: '.date('Y-m-d H:i:s', filectime($path)).'<br>';   // 創建時間
         echo 'file modify time: '.date('Y-m-d H:i:s', filemtime($path)).'<br>';   // 修改時間
         echo 'last access time: '.date('Y-m-d H:i:s', fileatime($path)).'<br>';   // 上次訪問時間
         echo 'file owner: '.fileowner($path).'<br>';   // 文件擁有者
         echo 'file permission: '.substr(sprintf('%o', (fileperms($path))), -4).'<br>';   // 文件權限,八進制輸出
         echo 'file group: '.filegroup($path).'<br>';   // 文件所在的組
     }
復制代碼
     效果如下:
 
    
 
     代碼中還用到了文件權限、所在組等函數,有必要解釋下(說的不對請修正)。一個文件的權限分為可讀可寫可執行,一般這樣表示:rwx,字母對應的表示可讀可寫可執行,從前往后規定值為4、2、1,三個值相加的結果最大為7,因此0666用的是八進制表示,這樣看起來就很方便。為7則表示這個文件具備這三個權限,那為什么打印的是0666呢?我們都知道,進入windows下面是有一個用戶的,在Linux下邊,與windows類似,也是有一個用戶登錄進去,因此一個文件可能為該用戶所有,一個用戶它還有自己所在的組,以及該系統中還有其他組(猜想這樣分應該是管理上的需要),因此對于0666,對于第一個6,表示該用戶對該文件的權限,第二個6表示該用戶所在的組對該文件的權限,第三個6表示其他的組所具有的權限(這樣就不用一一去區分除本組外其他的用戶了),6就知道該文件是可讀可寫的(win下可執行都知道是.exe文件)。
 
     2.目錄操作
 
     目錄的讀取,opendir:打開一個目錄,返回一個句柄,指向該目錄中的內容,如果把目錄中的內容看成一個有順序的數據,比如按順序的排列的數組,這個句柄就指向這個數組的開頭,事實上,系統會把該目錄中的內容按照字典排序,無論是文件還是子目錄。readdir:讀取下一個目錄內容,返回文件名,并自動指向該目錄中的下一個文件/目錄,所以讀取一個目錄中的內容,不包括子目錄中的內容,需要一個循環來控制,在讀取完后,還要關閉句柄變量,C語言讀取文件時也是這樣,打開就有關閉。以我的機子舉例:
 
復制代碼
<?php
    // 目錄的讀取
    $dir = 'F:/';
    echo 'details in '.$dir.'<br>';
    if(is_dir($dir)){
        if(($handle = opendir($dir)) == false){      // 獲取目錄句柄
             echo 'open dir failed';
             return;
         }
         while(($name = readdir($handle)) != false){  // 循環讀取該目錄下內容
             $filepath = $dir.'/'.$name;
             echo 'name: '.$name.' type: '.filetype($filepath).'<br>';
          }
         closedir($handle);                           // 關閉目錄句柄
     }
     else{
         echo $dir.' is not a directory<r>';
     }
復制代碼
      效果如下:
 
     
 
     可以看到實際上,系統給目錄中內容進行了忽略大小寫的字典排序。
 
     目錄的大小計算,我們知道文件的大小可以由filesize取得,但是php中沒有專門計算目錄大小的函數。當然php中有計算硬盤大小的函數disk_total_space(計算硬盤總空間)、disk_free_space(計算硬盤可用空間),但是我試了下disk_free_space,貌似計算得不對。正因為有filesize計算文件的大小,因此,需要用到遞歸,當是目錄時,進去繼續計算子目錄的大小,如果是文件,獲取到文件大小并加上返回,代碼如下:
 
復制代碼
<?php
    // 目錄大小計算
     function getDirSize($dirpath){
         $size = 0;
         if(false != ($handle = opendir($dirpath))){
             while(false != ($file = readdir($handle))){
                if($file == '.' $file == '..')        //注意過濾目錄中自帶的點和點點
                    continue;
                    
                $filepath = $dirpath.'/'.$file;          // 前面要接上路徑
                if(is_file($filepath)){                  // 是文件計算大小
                    $size += filesize($filepath);
                }
                else if(is_dir($filepath)){              // 是目錄繼續計算該目錄下的文件
                    $size += getDirSize($filepath);
                }
                else{
                    $size += 0;
                }      
               
             }
             closedir($handle);
        }
         return $size;
    }
   
    $dirsize = 'F:/size';
    $size = getDirSize($dirsize);
    echo 'dir size: '.getSize(null, $size).'<br><br>';  // 調用前面的數據處理函數
復制代碼
     我在F盤建了個size文件,隨便弄了點子目錄和文檔,效果如下,左邊是程序求得,右邊是右鍵查看文件夾屬性得到的,用以對比。
 
         
 
     目錄的新建和刪除,主要用到,mkdir:新建一個目錄,rmdir:刪除一個非空目錄,注意只能是非空,代碼如下:
 
復制代碼
<?php
    // 目錄的新建和刪除
    $newDirPath = 'F:/newDir';
    if(true == @mkdir($newDirPath, 0777, true)){      // 加@是因為文件已存在時php本身可能會拋出一個warning
        echo 'create directory '.$newDirPath.' successfully<br>';
    }
    else{
        if(file_exists($newDirPath))
            echo 'directory '.$newDirPath.' has existed<br>';
         else
            echo 'create directory '.$newDirPath.' failed<br>';
    }
    if(true == @rmdir('F:/aaa'))         //只能刪除非空目錄,如果刪除不存在的目錄自動拋出warning
         echo 'remove successfully<br>';
復制代碼
      那么問題來了,如果要刪除一個非空目錄咋辦,又得自己寫了,思想仍然是遞歸,因為php只提供了刪除文件函數unlink,所以在刪除一個目錄時,先opendir,再進入,如果是文件直接刪除,如果是目錄,繼續進入使用該方法處理,當然還可已返回一個bool變量表示刪除是否成功,代碼如下:
 
復制代碼
<?php
    // 刪除文件  unlink
    // 刪除目錄中的內容,然后刪除該目錄
    function clearDir($dirpath){
        if(file_exists($dirpath)){
             if(false != ($handle = opendir($dirpath))){
                 while(false != ($name = readdir($handle))){
                 if($name == '.' $name == '..')
                     continue;
                 $filename = $dirpath.'/'.$name;
                 if(is_dir($filename))
                     clearDir($filename);
                 if(is_file($filename))
                     @unlink($filename);
                 }
                 closedir($handle);
                 rmdir($dirpath);
              }
              else{
                 return false;
             }
          }
          else{
              return false;
          }
          return true;
      }
復制代碼
     在這里不得不說遇到的一個大坑,就是 . 和 .. 這兩個鬼玩意兒(點和點點),在操作系統中的每一個文件夾下邊,都會有 . 和 .. ,它們表示當前目錄和當前目錄的上級目錄,可惡的是前面在讀取目錄時居然沒顯示,導致遞歸函數成了死循環,因為 . 和 .. 在每一個目錄的最前面,必然會先讀到它倆,若不過濾,首先讀到 . ,它表示本目錄,然后又遞歸進入本目錄...這倆是操作系統下面的默認有的,它們是本目錄與上級目錄的連接符。
 
     通過計算目錄的大小和刪除非空目錄的代碼,寫復制和剪切目錄就非常容易,非常相似的遞歸思想,需要用到復制文件函數copy,文件移動函數rename,這個挺有趣,rename,字面上是重命名,但是重命名到另一個目錄中不就是剪切了么-_-
 
     3.文件讀寫
 
     php的某些文件讀取操作跟C語言非常像,所以也比較簡單,步驟就是先打開文件獲取句柄,檢查錯誤,然后讀寫處理,然后關閉,養成打開處理完后就關閉的好習慣,記得在C語言中的文件不關閉的話,打開兩次是會報錯滴,不知道記錯沒,所以嚴格點的程序都有非常多的處理,比如先驗證文件存在,然后驗證可讀可寫性,然后先關閉一下,然后再打開,打開時還得再檢查打開錯了沒......在打開文件時,就要選擇打開文件的模式,它決定了我們讀還是寫文件,當然是對需要這樣操作的函數有用。
 
     寫文件,寫文件函數只有fwrite、fputs、file_put_contents少數幾個,其中fwrite與fputs效果一樣,file_put_contents是一次性向文件寫入一些內容,它就不需要指定打開模式,同時它也可以是附加或者覆蓋現有文件內容,比如:
 
復制代碼
<?php
    // 寫  fwrite(別名fputs)
    $filepath = 'F:/10m.txt';
    function writeSome($filepath){
        if(($handle = fopen($filepath, 'r+')) == true){
             for($i=0; $i<10; $i++)
             fwrite($handle, $i." write something\r\n");   // windws以\r\n作為換行符
             fclose($handle);
         }
    }
     file_put_contents($filepath, 'use file_put_contents function', FILE_APPEND);  // 附加內容
復制代碼
      讀文件,讀文件的函數多些,有fread(讀取指定個字節)、fgetc(讀取一個)、fgets(讀取一行)、file(全部讀取,按行分配到一個數組中返回)、file_get_contents(默認讀取全部返回字符串)、readfile(直接將文件中內容輸出到緩存,效果就是直接在瀏覽器上輸出),伴隨著fread、fget、fgets運行,文件指針會自動往后走。因此連續讀最好是循環控制。讀到文件末尾怎么辦,EOF標識指示到達文件末尾,最好用feof檢測是否到文件末尾。不多說,看代碼:
 
復制代碼
<?php
    // fread讀取
    function readSome($filepath){
        if(($handle = @fopen($filepath, 'r')) == true){
            while(!feof($handle)){            // 判斷是否到達文件末尾
                $str = fread($handle, 10);    // fread讀取時,文件指針自動向后移動
                echo $str.'<br>';
            }
         }
    }
復制代碼
      如果想要讀取方式更靈活,就要配合fseek、rewind使用,它們可以移動文件指針到具體位置,fseek十分靈活,可以直接移到開頭或末尾,或從當前位置往前或后移動,讀取想要的內容,ftell還可告知當前位置,比如:
 
復制代碼
<?php
     function readFun($filepath){
         if(($handle = @fopen($filepath, 'r')) != false){
            echo 'current position: '.ftell($handle).'<br>';  // 輸出文件當前文件指針位置,以字節算,0表示開頭
             $str = fread($handle, 3);  // 讀取3個字節,同時指針自動后移3個字節
             echo 'read content: '.$str.'<br>';
             echo 'current position: '.ftell($handle).'<br>';  
             fseek($handle, 5, SEEK_CUR);  // 將文件指針從當前位置后移5個字節
             echo 'current position: '.ftell($handle).'<br>';
             $str = fread($handle, 5);
             echo 'read content: '.$str.'<br>';
             echo 'current position: '.ftell($handle).'<br>';  
             rewind($handle);  // 返回文件開頭
             echo 'current position: '.ftell($handle).'<br>';
             fseek($handle, 0, SEEK_END);   // 移到文件末尾
             echo 'current position: '.ftell($handle).'<br>';
             fclose($handle);  // 關閉文件
         }
     }
關鍵字:PHP、服務器、目錄
分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站