2023年7月3日发(作者:)
前端学PHP之⽂件操作前⾯的话 在程序运⾏时,程序本⾝和数据⼀般都存在内存中,当程序运⾏结束后,存放在内存中的数据被释放。如果需要长期保存程序运⾏所需的原始数据,或程序运⾏产⽣的结果,就需要把数据存储在⽂件或数据库。⼀般地,⼩型数据存储在⽂件中,海量数据存储在数据库中。本⽂主要介绍php中⽬录和⽂件的基本操作
⽂件类型 ⽂件⼀般指存储在外部介质上具有名字(⽂件名)的⼀组相关数据集合。⽤⽂件可长期保存数据,并实现数据共享 PHP是以UNIX的⽂件系统为模型的。因此在Windows系统中我们只能获得”file”、”dir”或者“unknown”三种⽂件类型。⽽在UNIX系统中,我们可以获得block、char、dir、fifo、file、link和unknown七种类型 可以使⽤函数filetype()获取⽂件的具体类型,可能的值有fifo,char,dir,block,link,file 和 unknownstring filetype ( string filename )
如果出错则返回 FALSE。如果调⽤失败或者⽂件类型未知的话 filetype() 还会产⽣⼀个 E_NOTICE 消息 在服务器中新建⼀个⽬录test,并在⽬录中新建⼀个⽂件 在这7种⽂件类型中,window系统常⽤的是'file'和'dir'这两种,它们配套的类型检测函数分别是is_dir( )和is_file( )is_dir( ) 判断给定⽂件名是否是⼀个⽬录。如果⽂件名存在并且是⼀个⽬录则返回 true,否则返回 false bool is_dir(_name)is_file( ) 判断给定⽂件名是否为⼀个正常的⽂件,如果⽂件存在且为正常的⽂件则返回 true
bool is_file(_name)
⽂件属性 ⼀般地,在⽂件或⽬录右键菜单中,选择属性,即可查看⽂件的属性 下表中列出了php中关于⽂件属性的常⽤函数
⽬录路径 windows下的⽬录路径使⽤是正斜杠(),⽽unix下的⽬录路径使⽤是反斜杠(/)$unixPath="/var/www/html/";
//在UNIX系统中的绝对路径,必须使⽤"/"分隔$winPath="C:";
//在Windows系统的绝对路径,默认使⽤""分隔$winPath2="C:/Appserv/www/";
//在Windows系统中也可使⽤“/”分隔 因为在Windows系统中也可使⽤(/)分隔。所以,在PHP中,不论是什么操作系统,全部都使⽤反斜杠(/)代表路径分隔符号
在PHP中,还提供了⼀个常量DIRECTORY_SEPARATOR,以此来代表⽬录分隔符,但写起来较⿇烦 在windows下多个路径的分隔符使⽤分号(;)分隔,⽽unix下使⽤冒号(:)分隔 在PHP中,提供了⼀个常量PATH_SEPARATOR,⽤来在跨平台的情况下,表⽰多个路径之间的分隔符换⾏ 在window下,换⾏是rn,⽽在unix下,换⾏是n。通常在写程序中,换⾏就以unix为准,写作n 同样地,PHP提供了⼀个常量PHP_EOL,⽤来在跨平台的情况下,表⽰换⾏.和.. 在PHP中,.表⽰当前⽬录,..表⽰上⼀级⽬录根路径 有两种根路径需要进⾏区分,⼀种是客户端根路径,⼀种是服务器根路径 以我⾃⼰在d盘安装的wamp为例,客户端根路径指'd:wampwww',⽽服务器根路径为为'd:'路径解析函数【basename()】 basename()函数⽤于返回路径中的⽂件名部分
>【dirname()】 dirname()函数⽤于返回路径中的⽬录部分【pathinfo()】 pathinfo()函数⽤于返回⽂件路径的信息【realpath()】 realpath()函数⽤于返回规范化的绝对路径名 在Windows上,realpath()会将unix风格的路径改成Windows风格的
⽬录遍历glob() glob()函数⽤于寻找与模式匹配的⽂件路径array glob ( string $pattern [, int $flags = 0 ] ) 在www⽬录下新建和⽂件opendir() opendir()函数⽤于打开⽬录句柄。如果成功则返回⽬录句柄的resource,失败则返回 FALSEresource opendir ( string $path [, resource $context ] )closedir() closedir()函数⽤于关闭⽬录句柄void closedir ([ resource $dir_handle ] ) 参数dir_handle表⽰⽬录句柄的 resource,之前由 opendir()所打开的。如果⽬录句柄没有指定,那么会假定为是opendir()所打开的最后⼀个句柄readdir() readdir()函数⽤于从⽬录句柄中读取条⽬,返回⽬录中下⼀个⽂件的⽂件名。⽂件名以在⽂件系统中的排序返回,失败时返回 FALSEstring readdir ([ resource $dir_handle ] ) 在www⽬录下新建⽬录test,并在⽬录test下新建和⽂件
";//.echo readdir($dir)."
";//..echo readdir($dir)."
";//o readdir($dir)."
";//o readdir($dir)."
";//closedir($dir);> 在遍历⽬录时,每个⽬录的前两个返回值都是.和..,.代表当前⽬录,..代表上⼀级⽬录 所以,⼀般地,列出当前⽬录的所有⽂件并去掉 . 和 ..,常采⽤下⾯的代码 接下来,在test⽬录下,新建⼀个⽬录in,并在in⽬录中新建⽂件。然后,⽬录和⽂件区分显⽰ [注意]通过is_dir()函数判断⽬录时,需要加⼊路径
"; }else{ echo "⽂件:".$file."
"; } } } closedir($handle);}/*⽂件:test/⽂件:test/⽬录:test/in */>
rewinddir() rewinddir()函数⽤于倒回⽬录句柄,将参数dir_handle指定的⽬录流重置到⽬录的开头void rewinddir ( resource $dir_handle ) 如果不使⽤rewinddir()函数,则⽂件只能遍历⼀次
"; }else{ echo "⽂件:".$file."
"; } } } while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { $file = "test/".$file; if(is_dir($file)){ echo "⽬录:".$file."
"; }else{ echo "⽂件:".$file."
"; } } } closedir($handle);}/*⽂件:test/⽂件:test/⽬录:test/in */> 使⽤rewinddir()函数,可以把⽬录句柄返回到第⼀个⽂件,从⽽实现重新遍历
"; }else{ echo "⽂件:".$file."
"; } } } rewinddir($handle); while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { $file = "test/".$file; if(is_dir($file)){ echo "⽬录:".$file."
"; }else{ echo "⽂件:".$file."
"; } } } closedir($handle);}/*⽂件:test/⽂件:test/⽬录:test/in⽂件:test/⽂件:test/⽬录:test/in */>
⽬录统计disk_total_space() disk_total_space()函数返回⼀个⽬录的磁盘总⼤⼩float disk_total_space ( string $directory )
";//4$ds = disk_total_space("D:");echo $ds;//1>disk_free_space() disk_free_space()函数返回⽬录中的可⽤空间float disk_free_space ( string $directory )
";//86087041024$ds = disk_free_space("D:");echo $ds;//481647472640> 下⾯来统计在www⽂件夹下新建的test⽬录的个数
$dir = opendir($file); while (false !== ($filename = readdir($dir))) { if($filename!="." && $filename !="..") { $filename = $file."/".$filename; //更新路径 if(is_dir($filename)) { $dirn++; getdirnum($filename); //递归,就可以查看所有⼦⽬录 } else { $filen++;
} } } closedir($dir); } getdirnum("test"); echo "⽬录数为:{$dirn}
";//⽬录数为:1 echo "⽂件数为:{$filen}
";//⽂件数为:3> 下⾯来统计在www⽂件夹下新建的test⽬录的⼤⼩
";//test⽬录⼤⼩为:302> ⽬录增删mkdir() mkdir()函数⽤于新建⽬录 bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )rmdir() rmdir()函数⽤于删除⽬录bool rmdir ( string $dirname [, resource $context ] ) [注意]该⽬录必须是空的,⽽且要有相应的权限。失败时会产⽣⼀个 E_WARNING 级别的错误unlink() unlink()函数⽤于删除⽂件bool unlink ( string $filename [, resource $context ] ) 下⾯来清空test⽬录
⽬录复制copy() copy()函数⽤于拷贝⽂件 bool copy ( string $source , string $dest [, resource $context ] ) [注意]copy()函数不能⽤于复制⽬录rename() rename()函数⽤于重命名⼀个⽂件或⽬录bool rename ( string $oldname , string $newname [, resource $context ] ) [注意]rename()函数具有移动⽂件或⽬录的功能
下⾯把www⽬录下的test⽬录剪贴,命名为t,并移动到d盘⽬录下 使⽤rename()只能实现剪切的操作,使⽤copy()只能复制⽂件。如果要复制⽬录,则需要使⽤循环和遍历
⽂件操作touch() touch()函数⽤来设定⽂件的访问和修改时间。如果⽂件不存在,则会被创建。成功时返回 TRUE, 或者在失败时返回 FALSEbool touch ( string $filename [, int $time = time() [, int $atime ]] ) 参数filename表⽰要设定的⽂件名,time表⽰要设定的时间。如果没有提供参数 time 则会使⽤当前系统的时间;atime表⽰如果给出了这个参数,则给定⽂件的访问时间会被设为atime,否则会设置为time。如果没有给出这两个参数,则使⽤当前系统时间copy() copy()函数⽤于拷贝⽂件bool copy ( string $source , string $dest [, resource $context ] ) [注意]copy()函数不能⽤于复制⽬录rename() rename()函数⽤于重命名⼀个⽂件或⽬录bool rename ( string $oldname , string $newname [, resource $context ] ) [注意]rename()函数具有移动⽂件或⽬录的功能unlink() unlink()函数⽤于删除⽂件bool unlink ( string $filename [, resource $context ] )
⽂件内容fopen() fopen()函数⽤于打开⽂件或者URL,fopen()将 filename 指定的名字资源绑定到⼀个流上 [注意]如果⽂件不存在,将新建并打开⽂件fopen('',w); fopen() 中 mode 的可能值列表mode 说明'r' 只读⽅式打开,将⽂件指针指向⽂件头。'r+' 读写⽅式打开,将⽂件指针指向⽂件头。'w' 写⼊⽅式打开,将⽂件指针指向⽂件头并将⽂件⼤⼩截为零。如果⽂件不存在则尝试创建之。'w+' 读写⽅式打开,将⽂件指针指向⽂件头并将⽂件⼤⼩截为零。如果⽂件不存在则尝试创建之。'a' 写⼊⽅式打开,将⽂件指针指向⽂件末尾。如果⽂件不存在则尝试创建之。'a+' 读写⽅式打开,将⽂件指针指向⽂件末尾。如果⽂件不存在则尝试创建之。fclose() fclose()函数⽤于关闭⼀个已打开的⽂件指针bool fclose ( resource $handle )fwrite() fwrite()函数⽤于写⼊⽂件(可安全⽤于⼆进制⽂件),返回写⼊的字符数,出现错误时则返回 FALSEint fwrite ( resource $handle , string $string [, int $length ] ) 当打开⽅式为只读模式时,⽆法向⽂件写⼊字符
";echo fwrite($fp, '23');//0echo "
";fclose($fp);> 当打开⽅式为写模式时,可以向⽂件写⼊字符
";echo fwrite($fp, '23');//2echo "
";fclose($fp);/*⽂件内容为123 */> 当打开⽅式为追加模式时,将向⽂件的尾部追加新的字符
";echo fwrite($fp, '23');//2echo "
";fclose($fp);/*刷新两次时,⽂件内容为123123 */>fgetc() fgetc()函数⽤于从⽂件指针中读取字符 [注意]使⽤fgetc()函数时,需要在fopen()函数中使⽤读模式string fgetc ( resource $handle )feof() feof()函数⽤于测试⽂件指针是否到了⽂件结束的位置bool feof ( resource $handle )fgets() fgets()函数⽤于从⽂件指针中读取⼀⾏string fgets ( resource $handle [, int $length ] ) 将test⽬录下的⽂件内容修改为aabbbfread() fread()函数⽤于读取⽂件(可安全⽤于⼆进制⽂件)。fread()从⽂件指针handle读取最多length个字节。该函数在读取了length个字节或到达了⽂件末尾(EOF)时将停⽌读取⽂件string fread ( resource $handle , int $length )fseek() fseek()函数⽤于在⽂件指针中定位,成功则返回 0;否则返回 -1int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )
将test⽬录下的⽂件内容修改为'12345'
";//12fseek($fp,4);echo fread($fp,2)."
";//5fseek($fp,-3,SEEK_END);echo fread($fp,2)."
";//34fclose($fp);>ftell() ftell()函数⽤于返回⽂件指针读/写的位置 int ftell ( resource $handle )rewind() rewind()函数⽤于倒回⽂件指针的位置,将handle的⽂件位置指针设为⽂件流的开头bool rewind ( resource $handle )file_get_contents() file_get_contents()函数⽤于将整个⽂件读⼊⼀个字符串string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) 页⾯变为百度⾸页file_put_contents() file_put_contents()函数⽤于将⼀个字符串写⼊⽂件int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) 使⽤该函数和依次调⽤ fopen(),fwrite() 以及 fclose() 功能⼀样 [注意]默认为写模式,若设置第三个参数为FILE_APPEND,则变为追加模式readfile() readfile()函数⽤于读取⽂件并写⼊到输出缓冲int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )file() file()函数⽤于把整个⽂件读⼊⼀个数组中,每⼀⾏作为⼀个数组的元素array file ( string $filename [, int $flags = 0 [, resource $context ]] ) 将的⽂件内容改为每⼀⾏⼀个数字,分别是1、2、3、4、5、6、7、8、9
";//1echo count($arr);//9>ftruncate() ftruncate()函数⽤于将⽂件截断到给定的长度bool ftruncate ( resource $handle , int $size ) [注意]使⽤ftruncate()函数时,需要使⽤追加模式。经测试,使⽤读模式时⽆效,使⽤写模式时,⽂件内容被清空 【新建⽂件】 php中并没有专门的新建⼀个空⽂件的函数,但是可以利⽤fopen()和touch()⽅法实现$file = fopen('',w);fclose($file);touchu('');
⽂件锁定 ⽂件操作是在⽹络环境下完成的,可能有多个客户端⽤户在同⼀时刻对服务器上的同⼀个⽂件访问。当这种并发访问发⽣时,很可能会破坏⽂件中的数据。例如,⼀个⽤户正向⽂件中写⼊数据,还没有写完时,其他⽤户在这⼀时刻也向这个⽂件写⼊数据,就会造成数据写⼊混乱。还有,当⽤户没有将数据写完时,其他⽤户就去获取这个⽂件中的内容,也会得到残缺的数据 在PHP中提供了flock()函数,可以对⽂件使⽤锁定机制(锁定或释放⽂件)。当⼀个进程在访问⽂件时加上锁,其他进程想对该⽂件进⾏访问,则必须等到锁定被释放以后。这样就可以避免在并发访问同⼀个⽂件时破坏数据语法: bool flock ( int handle, int operation [, int &wouldblock] ) PHP⽀持以咨询⽅式(也就是说所有访问程序必须使⽤同⼀⽅式锁定,否则它不会⼯作)锁定全部⽂件的⼀种轻便⽅法 handle 必须是⼀个已经打开的⽂件指针operation 可以是以下值之⼀: 要取得共享锁定(读取程序),将 operation 设为 LOCK_SH 要取得独占锁定(写⼊程序),将 operation 设为 LOCK_EX 要释放锁定(⽆论共享或独占),将 operation 设为 LOCK_UN 如果不希望flock()在锁定时堵塞,则给 operation 加上 LOCK_NB 如果成功则返回 TRUE,失败则返回 FALSE 下⾯是⼀个⽹络留⾔本的⽰例,⼀⽅⾯应⽤锁机制,另⼀⽅⾯综合地使⽤PHP中⽂件操作的内容
$mess = ""; //将数据遍历到$mess中 while(!feof($fp)) { $mess.=fread($fp, 1024); } //释放锁定 flock($fp, LOCK_UN+LOCK_NB); if(!empty($mess)){ $mess = rtrim($mess, "[n]"); //通过[n]将每⾏留⾔分割并存⼊数组中 $arrmess = explode("[n]", $mess); foreach($arrmess as $m) { //将每⾏数据使⽤'||'分割 list($username,$content,$t) = explode("||", $m); date_default_timezone_set('PRC'); echo "{$username}说:{$content}(".date('Y-m-d H:i:s',$t).")
"; }
} //关闭⽂件 fclose($fp); }>
⽂件上传 要想通过PHP成功地管理上传⽂件,需要通过以下三⽅⾯信息: 1、设置PHP配置⽂件中的指令:⽤于精细地调节PHP的⽂件上传功能 2、$_FILES多维数组:⽤于存储各种与上传⽂件有关的信息,其他数据还使⽤$_POST去接收 $_FILES["myfile"]["name"]中的值是:客户端⽂件系统的⽂件的名称 $_FILES["myfile"]["type"]中的值是:客户端传递的⽂件的类型 $_FILES["myfile"]["size"]中的值是:⽂件的字节的⼤⼩ $_FILES["myfile"]["tmp_name"]中的值是:⽂件被上传后在服务器存储的临时全路径 $_FILES["myfile"]["error"]中的值是:⽂件上传的错误代码(php 4.2以后增加的功能) 伴随⽂件上传时产⽣的错误信息代码具体如下: 值为0(UPLOAD_ERR_OK):表⽰没有发⽣任何错误 值为1(UPLOAD_ERR_INI_SIZE):表⽰上传⽂件的⼤⼩超出了约定值。⽂件⼤⼩的最⼤值是在PHP配置⽂件中指定的,该指令是:upload_max_filesize 值为2(UPLOAD_ERR_FORM_SIZE):表⽰上传⽂件⼤⼩超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最⼤值 值为3(UPLOAD_ERR_PARTIAL):表⽰⽂件只被部分上传 值为4(UPLOAD_ERR_NO_FILE):表⽰没有上传任何⽂件 值为6(UPLOAD_ERR_NO_TMP_DIR):表⽰找不到临时⽂件夹(PHP4.3.10和PHP5.0.3) 值为7(UPLOAD_ERR_CANT_WRITE):表⽰⽂件写⼊失败(PHP 5.1.0) 3、PHP的⽂件上传处理函数:⽤于上传⽂件的后续处理 只要把临时⽬录下的上传的⽂件,复制到指定⽬录下指定的名字就可以完成上传 PHP提供了专门⽤于⽂件上传所使⽤的is_uploaded_file()和move_uploaded_file()函数【is_uploaded_file()】 is_uploaded_file()判断⽂件是否是通过 HTTP POST 上传的bool is_uploaded_file ( string $filename ) 如果filename所给出的⽂件是通过 HTTP POST 上传的则返回
TRUE。这可以⽤来确保恶意的⽤户⽆法欺骗脚本去访问本不能访问的⽂件 [注意]为了能使is_uploaded_file() 函数正常⼯作,必须使⽤$_FILES['userfile']['tmp_name'],⽽在从客户端上传的⽂件名$_FILES['userfile']['name']不能正常运作【move_uploaded_file()】 move_uploaded_file()⽅法⽤于将上传的⽂件移动到新位置bool move_uploaded_file ( string $filename , string $destination ) 本函数检查并确保由
filename 指定的⽂件是合法的上传⽂件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果⽂件合法,则将其移动为由
destination 指定的⽂件 该函数成功时返回TRUE;如果filename不是合法的上传⽂件,不会出现任何操作,move_uploaded_file()将返回
FALSE;如果
filename 是合法的上传⽂件,但出于某些原因⽆法移动,不会出现任何操作,move_uploaded_file()将返回
FALSE。此外还会发出⼀条警告
header("Content-Type:text/plain;charset=utf-8");//判断错误if($_FILES['file1']['error'] > 0) { switch($_FILES['file1']['error']) { case 1: case 2: echo "上传⽂件太⼤"; break; case 3: echo "⽂件只被部分上传"; break; case 4: echo "没有上传任何⽂件"; break; default: echo "末知错误"; } exit;} //判断类型 $arr = explode(".", basename($_FILES['file1']['name'])); $hz = array_pop($arr); $allowtype =array("gif", "png", "jpg", "jpeg"); if(!in_array($hz, $allowtype)) { echo "上传的类型不合法"; exit; }
//判断⼤⼩ $maxsize= 1000000; if($_FILES['file1']['size'] > $maxsize) { echo "上传的⽂件超过了{$maxsize}字节!"; exit; } //随机⽂件名 $tmp_name = $_FILES['file1']['tmp_name']; $src_name = "./uploads/".date("YmdHis").rand(100, 999).".".$hz; if(move_uploaded_file($tmp_name, "$src_name")){ echo '上传成功'; }else{ echo '上传失败'; }
>
⽂件下载 简单的⽂件下载只需要使⽤HTML的链接标记,并将属性href的URL值指定为下载的⽂件即可下载 如果通过上⾯的代码实现⽂件下载,只能处理⼀些浏览器不能默认识别的MIME类型⽂件,如访问时,浏览器没有直接打开,⽽是弹出⼀个下载提⽰框,提⽰⽤户下载还是打开。如果需要下载'.html'、图⽚⽂件等浏览器识别的MIME类型⽂件时,浏览器将直接打开该⽂件 常见数据格式(MIME)如下 为了提⾼⽂件的安全性,不希望在标签中给出⽂件的链接,则必须向浏览器发送必要的头信息,以通知浏览器将要进⾏下载⽂件的处理【header()】 PHP使⽤header()函数发送⽹页的HTTP头部信息void header ( string $string [, bool $replace = true [, int $http_response_code ]] ) [注意]header() 必须在任何实际输出之前调⽤
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688382395a129645.html
评论列表(0条)