首頁 php教程 php手册 PHP 檔案系統詳解_php基礎

PHP 檔案系統詳解_php基礎

May 16, 2016 am 09:00 AM
檔案系統

文件处理函数
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);
?>
div>
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]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指南。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

修復事件ID 55,50,98,140磁碟錯誤在事件檢視器 修復事件ID 55,50,98,140磁碟錯誤在事件檢視器 Mar 19, 2024 am 09:43 AM

若您在Windows11/10的事件檢視器中發現事件ID55、50、140或98,或遇到磁碟檔案系統結構損壞且無法使用的錯誤,請依照下列指南解決此問題。什麼是事件55,磁碟上的檔案系統結構損壞和不可用的意思?第55屆會議,Ntfs磁碟上的檔案系統結構損壞且無法使用。請在磁碟區上執行chkMSK實用程式當NTFS無法將資料寫入交易日誌時,會觸發事件ID55的錯誤,這將導致NTFS無法完成無法寫入交易資料的操作。這種錯誤通常發生在檔案系統損壞的情況下,可能是由於磁碟上存在壞磁區或檔案系統對磁碟子系統的不

如何應對Linux系統中的檔案系統崩潰問題 如何應對Linux系統中的檔案系統崩潰問題 Jun 29, 2023 pm 04:05 PM

如何應對Linux系統中的檔案系統崩潰問題引言:隨著電腦技術的不斷發展,作業系統的穩定性和可靠性也變得越來越重要。然而,儘管Linux系統被廣泛認為是一個穩定且可靠的作業系統,但仍存在檔案系統崩潰的可能性。檔案系統崩潰可能會導致資料遺失和系統異常等嚴重後果。因此,本文將介紹如何應對Linux系統中的檔案系統崩潰問題,以幫助使用者更好地保護自己的資料和系統。

fstab(檔案系統表) fstab(檔案系統表) Feb 19, 2024 pm 06:30 PM

fstab(FileSystemTable)是Linux系統中的一個設定文件,用於定義系統啟動時掛載檔案系統的規則。 fstab檔案位於/etc目錄下,可透過手動建立或編輯器修改。每行規定一個要掛載的檔案系統。每一行有六個字段,它們的意義如下:檔案系統設備檔案或UUID可用於指定要掛載的檔案系統的設備,UUID是一個獨特的標識符,可透過blkid命令取得設備的UUID。 2.掛載點:指定檔案系統要掛載到的目錄,可以是絕對路徑(例如/mnt/data)或相對路徑(例如../data)。 3.檔案系統類

WIN10提示檔案系統錯誤2147416359的處理方法 WIN10提示檔案系統錯誤2147416359的處理方法 Mar 27, 2024 am 11:31 AM

1.按win+r進入運行窗口,輸入【services.msc】回車即可。 2.在服務視窗中,找到【windowslicensemanagerservice】,雙擊開啟。 3.在介面中,將啟動類型改為【自動】,然後點選【套用→確定】。 4、完成上面的設置,重啟電腦即可。

不同之處:NTFS與FAT32 不同之處:NTFS與FAT32 Feb 18, 2024 pm 10:18 PM

NTFS和FAT32是兩種常見的檔案系統,用於組織和管理電腦硬碟上的資料。雖然它們都具有一些共同的功能和特點,但在許多方面也有一些重要的區別。本文將探討NTFS和FAT32之間的幾個主要差異。功能與效能:NTFS(NewTechnologyFileSystem)是微軟Windows作業系統中較新的檔案系統,它具備許多先進的功能,如資料壓縮、檔案加密、

深入了解Linux的標準檔案系統(Ext2/Ext3/Ext4) 深入了解Linux的標準檔案系統(Ext2/Ext3/Ext4) Dec 31, 2023 pm 10:18 PM

Ext全名為Linuxextendedfilesystem,extfs,即Linux擴充檔案系統,Ext2就代表第二代檔案擴充系統,Ext3/Ext4以此類推,它們都是Ex​​t2的升級版,只不過增加了日誌功能,且彼此向下兼容,所以Ext2被稱為索引式檔案系統,而Ext3/Ext4被稱為日誌式檔案系統。備註:Linux支援許多檔案系統,包括網路檔案系統(NFS)、Windows的Fat檔案系統。查看Linux支援的檔案系統:ls-l/lib/modules/$(uname-r)/kernel/fs查看

Go語言中如何處理並發檔案的檔案系統檔案鎖定和進程間檔案共用問題? Go語言中如何處理並發檔案的檔案系統檔案鎖定和進程間檔案共用問題? Oct 09, 2023 pm 05:53 PM

Go語言中處理並發檔案的檔案系統檔案鎖定和進程間檔案共享問題引言:在Go語言中,我們常常需要處理並發存取檔案的情況,包括檔案系統檔案鎖定和進程間檔案共用。本文將介紹如何使用Go語言處理這些問題,並提供具體的程式碼範例。一、檔案系統檔案鎖在多個並發程式同時存取同一個檔案時,為了避免出現競爭條件和資料不一致的問題,我們可以使用檔案系統檔案鎖定來進行同步。 Go語言提供了s

Go語言中如何處理並發檔案的檔案系統檔案切割和檔案合併問題? Go語言中如何處理並發檔案的檔案系統檔案切割和檔案合併問題? Oct 08, 2023 am 11:13 AM

Go語言中如何處理並發檔案的檔案系統檔案切割和檔案合併問題?在處理大檔案時,我們常常需要將檔案切割成小塊進行處理,並在處理完成後將小塊檔案合併成一個完整的檔案。在並發處理大檔案時,我們希望能夠充分利用多個處理器核心來提高處理速度。 Go語言提供了豐富的並發處理機制和檔案操作函數,可以很方便地實現檔案系統檔案切割和檔案合併。首先,我們需要確定檔案切割的大小。可以

See all articles