Heim >Backend-Entwicklung >PHP-Tutorial >PHP 文件系统
文件?理函?
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?停止?行。
例子:<?php $filename="./files.text"; $fp=fopen($finename,"rb"); $encho fread($fp,100); ?>
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:表示?有上?任何文件。
例子:<?php /*判?是否由上??片*/ 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]."<br/>"; echo "上?文件?型:".$type."<br/>"; echo "上?文件大小:".$_FILES['up_picture'][size]."<br/>"; }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的同????出一?警告。
<?php 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指南。