第10章 文件目录类
在任何计算机设备中,文件和目录都是必需的对象。而在Web编程中,对文件的操作是程序员时常遇到的,比如文件及文件目录的创建、显示、修改等操作。本章就对这些PHP中的函数做详细讲解并通过实例演示如何使用。
10.1 创建目录和文件
使用PHP创建文件的目录,需要用到mkdir()函数,使用的语法如下所示:
bool mkdir ( string pathname [, int mode [, bool recursive [, resource context]]] )
该函数尝试新建一个由pathname指定的目录,成功时返回TRUE,失败则返回FALSE。其中的4个参数解释如下。
- pathname:规定要创建的目录的名称。
- mode:规定权限。默认是0777,意味着有最大可能的访问权。
- recursive:规定是否设置递归模式。
- context:规定文件句柄的环境。context是可修改流的行为的一套选项。
第1个参数是必需的,其他3个都是可选项。
创建一个文件目录并将它的属性设置为只读的示例代码如下:
<?php mkdir("需要创建的路径", 0700); ?>
只需调用这个函数就能生成一个文件目录。如果创建的目录是在父目录下的,则该父目录必须已经存在,否则程序就会报错。或者可以使用如下语句来创建目录:
<?php mkdir("父目录/需要创建的路径", 0700, TRUE); ?>
此语句将mkdir()函数的第三个参数mode设置为TRUE,这时就可以创建有任意级数的文件目录,如果其父目录不存在就自动创建。
在创建完成一个目录以后,就可以在该目录下创建文件了。这时需要用到fopen()函数,该函数的使用语法如下:
resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )
filename为需要创建的文件的文件名,如果filename指定的是一个本地文件,将尝试在该文件上打开一个流。
注意 filename指定的文件必须是PHP可以访问的,因此需要确认该文件的访问权限允许相应的访问操作。
参数mode为以什么方式打开文件。表10.1给出了各种mode的定义。
表10.1 打开文件的模式
如下语句是利用函数fopen创建一个名为“新建文本文件”,格式为.txt的文件。
<?php fopen("新建文本文件.txt", "w"); ?>
这段代码中,设置mode的模式为“w”,因为这个文件是新建的并不存在,所以PHP便会自动创建这个文件。
10.2 列出目录和文件
在讲解了如何创建目录和文件以后,接下来就是如何显示它们的问题。但是在读取目录和文件之前,都需要先指定一个根目录。
(1)可以使用PHP提供的opendir()函数来指定这个根目录,其使用语法如下所示:
resource opendir ( string path [, resource context] )
opendir()函数打开一个目录句柄,可由closedir(),readdir()和rewinddir()使用。若成功,则该函数返回一个目录流,否则返回false及一个error。可以通过在函数名前加上“@”来隐藏error的输出。
(2)打开一个目录后就可以使用readdir()函数读取目录,函数使用语法如下所示。
string readdir ( resource dir_handle )
该函数返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回。其中的dir_handle是使用opendir()返回的目录句柄。
(3)在读取文件目录以后,最后一步需要做的是将打开的文件句柄关闭掉。这时需要使用到closedir()函数,语法如下所示:
void closedir ( resource dir_handle )
该函数关闭由dir_handle指定的目录流。流必须之前被opendir()所打开。
代码10-1是使用readdir()等函数列出指定目录下的目录和文件的例子。
代码10-1 列出目录和文件
<span class="kindle-cn-bold">列出目录和文件</span><hr /> 目录下的所有文件如下:<br /> <?php if ($handle = opendir('./')) { //指定当前目录 while (false !== ($file = readdir($handle))) { //循环读取目录下的文件 echo "$file<br />"; } closedir($handle); //关闭目录流 } ?>
以上代码首先指定列出当前目录下的目录和文件,然后使用while循环逐个读取并输出,最后关闭文件流。如图10.1所示的运行程序后的结果。
图10.1 列出目录和文件
10.3 获得磁盘空间
获取磁盘空间这个功能在很多的网络硬盘上都能看到,这些空间一般都会规定空间大小,限制上传文件的总量。本节就来讲解如何获得磁盘空间大小。
计算磁盘空间大小除了需要用到上节介绍的函数外,还需要用到一个计算文件大小的函数filesize(),使用语法如下所示:
int filesize ( string filename )
filesize()函数返回指定文件的大小。若成功,则返回文件大小的字节数。若失败,则返回FALSE并生成一条E_WARNING级的错误。
Tips filesize()函数的结果会被缓存,可以使用clearstatcache()来清除。
有了以上基础以后,就可以计算某个目录下所有文件的大小。代码10-2是计算某个目录下所有文件大小的例子。
代码10-2 获得磁盘空间
<span class="kindle-cn-bold">获得磁盘空间</span><hr /> 目录下的所有文件大小:<br /> <?php function dir_size($dir) { @$dh = opendir($dir); //打开目录,返回一个目录流 $size = 0;//初始大小为0 while ($file = @readdir($dh)) { //循环读取目录下的文件 if ($file != "." and $file != "..") { //如果返回的不是本目录(.)或者上级目录(..) $path = $dir."/".$file; //设置目录,用于含有子目录的情况 if (is_dir($path)) { //如果是目录文件 echo "$path<br />"; $size += dir_size($path); //递归调用,计算目录大小 } elseif (is_file($path)) { //如果是文件 echo "$path ". filesize($path) ." BYTE<br />"; $size += filesize($path); //计算文件大小 } } } @closedir($dh); //关闭目录流 return $size; //返回大小 } $dir = "."; //指定文件所在的目录 $dir_size = dir_size("$dir"); //计算目录大小 echo "总大小:". $dir_size ." BYTE"; ?>
图10.2 获得磁盘空间
以上把计算目录文件的代码写成一个函数,目的是为了能够把子目录下的文件也都计算进来,需要用到函数的递归调用。在函数中首先打开一个需要计算大小的目录,然后使用while循环来遍历目录中的文件。如果遍历中遇到的是目录,则再次调用自身函数计算大小并记录相应的大小。如果是文件则使用filesize()函数来计算它的大小并记录。如此循环,直到计算完目录下的所有文件位置。运行代码后得到的结果如图10.2所示。
10.4 改变目录和文件的属性
关于目录和文件的属性,一般是基于安全原因或者在对于权限有分配需求的系统中常会用到。Web程序基于安全原因都会把一些文件对浏览者只给可读权限,这时就要设置文件的属性为只读。但是有时候又允许用户上传图片、视频、音乐等文件,这时又得把上传文件的所在目录设置为可写,需要给用户修改权限。本节讲解如何设置目录和文件的这些访问属性。
在PHP中目录和文件的属性都是通过chmod()函数来完成修改的,该函数的使用方法如下:
bool chmod ( string filename, int mode )
chmod()函数可以改变文件模式。如果成功则返回TRUE,否则返回FALSE。filename是需要设置属性的文件或者目录。mode是对filename设置的属性,该参数由4个数字组成,第一个数字永远是0,第二个数字规定所有者的权限,第二个数字规定所有者所属的用户组的权限,第四个数字规定其他所有人的权限。这些数字可能的值有3种,分别如下所示。
- 1:执行权限
- 2:写权限
- 4:读权限
如需设置多个权限,请对上面的数字进行总计。
例如,对所有者可读写,其他人没有任何权限,可使用如下代码:
chmod("test.txt", 0600);
对所有者可读写,其他人可读,可使用如下代码:
chmod("test.txt", 0644);
对所有者有所有权限,其他所有人可读和执行,可使用如下代码:
chmod("test.txt", 0755);
对所有者有所有权限,所有者所在的组可读,可使用如下代码:
chmod("test.txt", 0740);
10.5 写入数据到文件
介绍了这么多,也许读者最关心的就是如何将数据写入到文件中。因为数据才是最重要的,所以得好好保存下来。本节就来讲解如何使用PHP将数据写入到文件中。PHP提供很多种方式来将数据写入到文件中,这里介绍两种最常用的方法。
10.5.1 使用fwrite()函数将数据写入文件
首先第一种是使用fwrite()函数来将数据写入文件中,该函数的使用语法如下:
int fwrite ( resource handle, string string [, int length] )
fwrite()把string的内容写入文件指针handle处,成功后返回写入内容的长度,否则返回FALSE。如果指定了length,当写入了length个字节就会停止。当length大于写入内容长度时,那么当内容写入完成以后会自动停止。
在使用fwrite()函数之前,需要先调用前面10.1节提到的fopen函数来打开一个文件,返回一个文件指针作为入参。
注意 因为现在是对文件进行写入操作,所以在使用fopen打开文件时一定要选择正确的模式。
代码10-3是使用fwrite()函数将数据写入到文件中的一个例子,如下所示。
代码10-3 使用fwrite()函数写入数据到文件
<span class="kindle-cn-bold">写入数据到文件</span><hr /> 正在写入文件...<br /><br /> <?php $filename = '数据写入测试文件.txt'; $somecontent = "测试用文字,我爱PHP!\r\n"; // 在这个例子里,将使用添加模式打开$filename // 因此,文件指针将会在文件的开头 // 那就是当使用fwrite()的时候,$somecontent将要写入的地方 if (!$handle = fopen($filename, 'a+')) { echo "不能打开文件 $filename"; exit; } // 将$somecontent写入到打开的文件中 if (fwrite($handle, $somecontent) === FALSE) { echo "不能写入到文件 $filename"; exit; } echo "成功地将<br /><br /><font color='green'>$somecontent</font><br /><br />写入到文件<br /><br /><font color='red'>$filename</font>"; fclose($handle); ?>
首先定义需要写入的数据与被写入数据的文件,然后使用fopen()函数打开文件,使用fwrite()将数据追加到该文件中。因为在打开文件时mode参数设置为“a+”,所以这个程序如果多运行几次就会在文件中看到多个写入的数据。运行以上代码看到的效果如图10.3所示,多刷新几次后打开“数据写入测试文件.txt”文件,会看到有多次数据添加到文件中,效果如图10.4所示。
图10.3 使用fwrite()函数写入数据到文件 | 图10.4 使用fwrite()函数写入数据到文件的结果 |
写入文件的效果会因为在使用fopen时输入的mode类型不同而有所不同,具体参数意义请参考10.1的表10.1。
10.5.2 使用file_put_contents()函数将数据写入文件
第二种常用写入数据的方式非常简单,使用file_put_contents()函数,该函数使用语法如下所示:
int file_put_contents ( string filename, string data [, int flags [, resource context]] )
使用该函数来将数据写入文件与依次调用fopen(),fwrite()及fclose()功能一样。其使用的参数详细解释如下。
- filename:要被写入数据的文件名。
- data:要写入的数据。类型可以是string、array或者是stream资源。
- flags:flags可以是FILE_USE_INCLUDE_PATH,FILE_APPEND和/或LOCK_EX(获得一个独占锁定),但是使用FILE_USE_INCLUDE_PATH 时要特别谨慎。
- context:一个context资源。
如果使用file_put_contents()函数,可以只用一个语句便能将数据写入到文件中。
<?php file_put_contents("测试文件.text", "我爱PHP!"); ?>
10.6 从文件读取数据
通过上一个小节的讲解,相信读者已经能很熟练地将数据写入到文件中了。那么本节就在这样的基础上来讨论如何读取文件中的这些数据。同样,PHP对从文件中读取数据的操作也提供了很多种方法,这里介绍两种最常用的。
10.6.1 使用fread()函数读取文件数据
与fwrite()函数相对,PHP也提供一个fread()函数来对文件的数据进行读取操作。该函数的使用语法如下所示:
string fread ( int handle, int length )
fread()函数从文件指针handle读取最多length个字节,返回所读取的字符串,如果出错返回FALSE。该函数在读取完最多length个字节数,或到达EOF的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了8192个字节时就会停止读取文件,如果哪种情况先遇到即结束。
该函数的操作步骤与fwrite()函数差不多,都需要先使用fopen打开一个文件,然后对其操作,最后使用fclose将其关闭。代码10-4是使用fread()函数从文件中读取数据的例子,如下所示。
代码10-4 从文件读取数据
<span class="kindle-cn-bold">从文件读取数据</span><hr /> 正在读取文件...<br /><br /> <?php $filename = '数据读取测试文件.txt'; //定义需要读取的文件 $handle = fopen($filename, "rb"); //以二进制方式打开 $contents = fread($handle, filesize ($filename)); //读取文件 echo "读取到的数据如下:<br />"; echo "<pre>"; echo $contents; //输出读取的数据 echo "</pre>"; fclose($handle); //关闭文件 ?>
运行以上代码后,得到的结果如图10.5所示。读取的是上个例子中的文件内容。
图10.5 从文件读取数据
10.6.2 使用file_get_contents()函数读取文件数据
当然前面介绍的fread()函数,还可以使用file_get_contents()函数来读取文件中的数据。该函数的使用语法如下所示:
string file_get_contents ( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] )
file_get_contents()函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。虽然该函数接受4个参数,但是用得最多的是第1个参数filename,它用来指定需要读取的文件。其他3个可选参数用到的很少,就不多做介绍了。
使用file_get_contents()函数读取文件数据很简单,如下所示:
<?php echo file_get_contents(“数据读取测试文件.txt”); ?>
只使用一个语句就能将文件中的数据读出并输出到页面上。
10.7 修改文件内容
前面几节中,已经讲解了如何创建文件、如何对文件写入数据、如何读取文件中的数据,最后来说一下如何修改文件中的内容。
修改的过程首先是打开一个文件,读取其中的内容并替换,然后保存。这些过程在前面的小节中都已经做了详细的讲解,这里不再赘述。代码10-5是使用PHP修改文件内容的一个例子,如下所示。
代码10-5 修改文件内容
<span class="kindle-cn-bold">修改文件内容</span><hr /> <?php $filename = '数据修改测试文件.txt'; //定义需要读取的文件 echo "原文件的内容:"; echo "<pre>"; echo file_get_contents($filename); //输出文件数据 echo "</pre>"; $contents = file_get_contents($filename); //读取文件中的数据 $contents = str_replace("爱", "喜欢", $contents); //将数据中的“爱”,修改成“喜欢” file_put_contents($filename, $contents); //保存 echo "修改后的内容:"; echo "<pre>"; echo file_get_contents($filename); //输出文件数据 echo "</pre>"; ?>
以上代码首先使用file_get_contents()函数读取文件数据,然后对数据做修改,最后file_put_contents()函数将修改完成后的数据保存到原文件中。这样就完成了对一个文件数据的修改过程,代码运行得到的效果如图10.6所示。
图10.6 修改文件内容
10.8 删除目录和文件
如果哪个目录或者文件以后都不会用到,就该把它们从系统中删除,以免占用过多的空间,这样也便于文件的查找。
在PHP中删除一个目录和文件显得异常简单,只需要分别调用一个函数就可以。删除目录时使用rmdir()函数,其语法如下:
bool rmdir ( string dirname )
该函数尝试删除dirname所指定的目录,如果成功则返回TRUE,失败则返回FALSE。该目录必须是空的,而且要有相应的权限。
如果需要删除某个指定的文件,可以使用unlink()函数。使用语法如下:
bool unlink ( string filename )
该函数尝试删除filename所指定的文件,如果成功则返回TRUE,失败则返回FALSE。
在PHP中通过以上两个函数就可以删除目录和文件,但是通常删除目录时,该目录并不为空。这时候就需要把其下的子目录和文件都先删除掉,然后再删除本目录。代码10-6演示了如何删除一个包含有子目录的函数,如下所示。
代码10-6 删除目录和文件
<span class="kindle-cn-bold">删除目录和文件</span><hr /> <?php function full_rmdir($dirname){ //定义函数 if ($dirHandle = opendir($dirname)){ //打开指定的目录 $old_cwd = getcwd(); //取得当前工作目录 chdir($dirname); //将 PHP 的当前目录改为$dirname while ($file = readdir($dirHandle)){ //循环目录下的文件 if ($file == '.' || $file == '..') continue; //如果是当前目录或者父目录则跳过 if (is_dir($file)){ //如果是目录 if (!full_rmdir($file)) return false; //递归调用自身函数删除目录 }else{ //如果是文件 if (!unlink($file)) return false; //删除文件 } } closedir($dirHandle); //关闭目录 chdir($old_cwd); //将 PHP 的当前目录改为$old_cwd if (!rmdir($dirname)) return false; //删除$dirname目录 return true; }else{ return false; } } $remove_dir = "测试目录"; echo "正在删除 $remove_dir 目录...<br></br>"; if(full_rmdir($remove_dir)) { echo "<font color=\"green\">删除 $remove_dir 成功!</font>"; } else { echo "<font color=\"red\">删除 $remove_dir 失败!</font>"; } ?>
为了测试以上代码的有效性,需要建立一个包含有子目录和文件的测试目录,如图10.7所示。然后运行程序得到信息,如图10.8所示,表示删除目录成功。打开原来文件所在的目录,发现先前建立的测试目录已经被删除,如图10.9所示。
图10.7 含有子目录和文件的测试目录 | 图10.8 运行程序 | 图10.9 测试目录被删除 |
10.9 一个文本计数器实例
讲了那么多关于文本的知识,本章最后就来做个文本计数器。想必大家在网上冲浪的时候,会常常看到有些网站显示本站已有多少人数访问之类的统计,是不是也忍不住想亲手制作一个这样的计数器呢?
制作一个文本计数器的原理和修改文字中的数据的思路是一样的。都是打开文件,修改文件中的内容然后再把数据保存到文件中。需要用到的函数在前面的小节中都已经介绍过,这里就不再赘述。代码10-7就是一个简单的文本计数器,如下所示。
代码10-7 一个文本计数器实例
<span class="kindle-cn-bold">文本计数器实例</span><hr /> 本页面已经被受访的次数为:<br /><br /> <?php $count = file_get_contents("count.txt"); echo "<font color=\"green\">". ++$count ."</font>"; file_put_contents("count.txt", $count); ?>
可以看到,使用PHP做一个文本计数器是非常方便而且简单的。实际上的代码只要3行,读取文件,数值自动加1,保存数据。运行以上代码,首先需要在同目录下新建一个“count.txt”的文件,并把内容设置为0,当然你也可以设置为其他的数值。然后运行得到的页面结果如图10.10所示,刷新后可以看到页面计数的变化,图10.11是页面被浏览了17次后的结果。
图10.10 第一次浏览 | 图10.11 多次浏览后的结果 |
本实例给出的计数器很简单,在此基础上还可以开发出更多功能,或者有好看效果的计数器。比如可以使用Session来记录相同人数的访问,使用图片来替换显示的数字等。
10.10 典型实例
【实例10-1】目录函数主要包括打开、读取目录等操作。使用这些目录函数,可以轻易地在服务器上进行相关的目录操作。
本实例代码中使用到的函数主要包括:opendir()、readdir()、rewinddir()、closedir(),以及directory类。
(1)opendir()函数用于打开一个目录句柄。打开的句柄可以被readdir()、rewinddir()、closedir()等函数使用。opendir()函数只有一个必选参数,用于指定创建句柄的目录。函数运行成功后,将返回目录的句柄,如果失败将返回FALSE值。
(2)readdir()函数用于返回目录中下一个文件的文件名。其与目录的关系,类似于each()函数与数组的关系。readdir()函数只有一个必选参数,就是读取目录的目录句柄。readdir()运行成功后,将返回一个文件名,否则返回FALSE值。
(3)rewinddir()函数用于把指定的目录流,重置到目录的开头。其只有一个必选参数,即opendir()函数打开的目录句柄。
(4)closedir()函数,用于关闭opendir()函数打开的目录句柄,其只有一个必选参数,即opendir()函数打开的目录句柄的名称。
(5)实际上directory类是dir()函数内定义的一个内部类。directory类包括两个属性和3个方法,两个属性是path和handlle。path属性的值为被打开的目录路径。handle属性的值为目录句柄,类似于opendir()返回的值,handle属性可以用于readdir()、rewinddir()、closedir()等函数。而三个方法read()、rewind()、close(),分别对应的目录函数是readdir()、rewinddir()、closedir()。
代码10-8 使用目录函数进行操作
<?php echo "<strong>使用目录函数读取目录</strong><br>"; $dir = "html"; //使用opendir()函数打开目录 $handle = opendir($dir); if($handle == false){ echo "打开目录失败!"; }else{ echo "目录句柄: " . $handle . "<br>"; echo "目录名称: " . $dir . "<br>"; //使用readdir()读取目录信息 while($file = readdir($handle)){ //使用readdir()函数读取目录句柄的内容赋值给$file变量,并把目录指针向下移动一位 if($file !== false){ //当readdir()函数返回的值不等于false时,显示返回值 echo $file."<br>"; } } } //使用closedir()关闭目录句柄 closedir($handle); echo "<strong>使用Directory类读取目录</strong><br>"; $dh = dir($dir); echo "目录句柄: " . $dh->handle . "<br>"; echo "目录名称: " . $dh->path . "<br>"; while ($file = $dh->read()) { //使用read()方法,获取当前指针指向的文件名 if($file !== false){ //当read()方法获回的值不等于false时,显示返回值 echo $file."<br>"; } } $dh->close(); ?>
运行该程序后,运行结果如图10.12所示。
图10.12 程序运行结果
【实例10-2】PHP中关于文件操作的函数很多,涉及到文件的读取、写入、属性、信息、状态等操作。本实例代码中使用到的函数主要包括:fopen()、fread、fwrite()、fclose()、file_get_contents()、file_put_contents()。
(1)fopen()函数用于打开一个文件句柄。其有两个必选参数:
- 参数一的值是需要打开的文件名称。
- 参数二的值用于指定打开文件的方式,其取值如表10.1所示。
表10.1 打开文件方式
(2)fread()函数用于读取文件内容。fread()函数有两个必选参数,第一个参数的值是由fopen()打开的文件句柄。第二个参数是要读取的内容长度。fread()函数最多可以读取8192个字节。
(3)fwrite()函数用于写入文件内容。fwrite()函数有三个参数:
- 参数一是必选参数,其值是由fopen()打开的文件句柄。
- 参数二是必选参数,其值是要写入文件的内容。
- 参数三是可选参数,用于指定写入文件的字节数。
(4)fclose()函数,用于关闭fopen()函数打开的文件句柄,以节省系统资源。
(5)file_get_contents()函数用于读取指定文件内容。file_get_contents()函数同时包括了fopen()、fread()、fclose()三个函数的功能,并且file_get_contents()函数读取文件内容时,不受8192字节的限制。
(6)file_put_contents()函数用于把内容写入指定文件。file_put_contents()函数同时包括了fopen()、fwrite()、fclose()函数的功能。
代码10-9 PHP中关于文件操作的函数
<?php //定义一个变量,其值为要打开的文件 $file = "do.txt"; //使用fopen()函数打开文件,打开方式是w.并使用判读打开状态。 if(false === ($fp = fopen($file,"w"))){ echo "打开文件失败!<br>"; }else{ echo "文件打开成功!<br>"; } //定义变量,存储写入文件的内容 $c = "写入do.txt文件的内容"; //使用fwrite()函数写入文件,并判读写入状态 if(fwrite($fp,$c,strlen($c))===false){ echo "文件写入失败!<br>"; }else{ echo "文件写入成功!<br>"; } //关闭文件句柄 fclose($fp); //使用fopen()打开文件,打开方式是r $fp = fopen($file,"r"); //使用fread()读取文件的前8192个字节。 echo "<br>显示读取的文件内容:<br>".fread($fp,8192); fclose($fp); //关闭文件句柄 $handle = fopen("http://www.baidu.com","r"); //访问远程文件 $contents = ""; //循环读取文件 while (!feof($handle)){ //如果没有到文件尾,继续读取文件 $contents .= fread($handle, 8192); } fclose($handle); //关闭文件句柄 echo $contents; //输出获取的内容 //使用file_put_contents()函数,向文件写入内容,并判读写入状态 if(file_put_contents($file,"使用file_put_contents()函数写入的内容。")>0){ echo "<br>使用file_put_contents()函数写入文件成功!<br>"; }else{ echo "<br>使用file_put_contents()函数写入文件失败!<br>"; } //使用file_get_contents()函数读取文件内容,并显示 $get = file_get_contents($file); //使用file_get_contents()获取文件的内容 echo "<br>使用file_get_contents()函数读取的文件内容:<br>".$get; ?>
运行该程序后,运行结果如图10.13所示。
图10.13 程序运行结果
【实例10-3】基于目录与文件函数相册的实现。本实例将根据前面两个实例中介绍的知识,完成一个基于目录与文件的相册程序。
本实例的相册包括两个部分:图片上传和图片浏览。
(1)图片上传会应用到move_uploaded_file()函数。move_uploaded_file()函数的作用是把客户端上传的文件,移动到指定目录,其有两个必选参数:
- 参数一的值用于上传后的临时文件名。
- 参数二的值是临时文件移动的目标目录,以及文件名称。
在使用move_uploaded_file()函数时一定要注意,当目标文件存在时,目标文件将会被覆盖。
(2)is_dir()函数,用于判读指定的目录名是否是一个目录。
(3)mkdir()函数,用于在当前目录下,根据参数创建新的目录。
代码10-10 基于目录与文件的相册程序
<?php //初始化 $album = "album"; if(is_dir($album)!==true){ //使用is_dir()函数,检测变量$album变量的值指向的文件夹是否存在 mkdir($album); //如果文件夹不存在,就使用mkdir()函数创建这个文件夹,初始化完成 } //处理上传文件 if(isset($_POST["action"]) and $_POST["action"]=="upload"){ //检测POST变量中,是否存在约定变量,以及约定变量的值是否正确 if(isset($_FILES["file"]["tmp_name"])){ //检测$_FILES变量中是否存在数据 //定义文件存放的目录 //定义新的文件名,此处使用原文件名 $filename = $_FILES["file"]["name"]; //使用move_uploaded_file()把上传的临时文件,移动到新目录 if(move_uploaded_file($_FILES["file"]["tmp_name"],$album."/".$filename)){ echo "上传文件成功!"; }else{ echo "上传文件失败!"; } } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>相册</title> <style> body{margin:0px;padding:0px;background-color: #EFEFEF;font-size:12px;} ul{ margin:0px; padding:0px;list-style:none;} a{color:#333333;text-decoration:none;} a:hover{color:#999999;} .ablum_out{width:98%px;margin-left:10px;margin-top:10px;} .ablum_out img{margin:4px;border:#ccc 1px solid;} .ablum_out li{float:left;width:180px;text-align:center;margin:5px;} </style> </head> <body> <form action="" method="post" enctype="multipart/form-data" name="form1" id="form1"> <label>上传图像 <input type="file" name="file" /> </label> <label> <input type="submit" name="Submit" value="提交" /> <input type="hidden" name="action" value="upload"/> </label> </form> <hr size="1" /> <div class="ablum_out"> <ul> <?php $dh = dir($album); echo "相册目录: " . $dh->path . "<br>"; while (false !== ($file = $dh->read())) { if($file != "." and $file != ".."){ echo '<li><a href="'.$album."/".$file.'" target="_blank"><img src="'.$album."/".$file.'" width="160" height="120" border="0" /><br />'.$file.'</a> </li>'; } } $dh->close(); ?> </ul> </div><br/> </body> </html>
运行该程序后,运行结果如图10.14所示。
图10.14 程序运行结果
10.11 小结
本章主要介绍了PHP编程中对文件的基本操作,包括判断文件是否存在、获取文件属性、读取文件内容、写入文件、遍历目录、创建目录等操作。文件的操作在PHP编程中有着广泛的应用,所以熟练掌握这些函数的使用及文件操作都是十分必要的。
10.12 习题
一、填空题
1. 对一个文件进行访问之前,一般需要先判断文件是否存在,利用file exists()函数判断文件是否存在,如果文件或目录存在,则返回值_____,反之返回_____。
2. 在进行处理文件时,要知道文件的大小、类型、访问时间、文件权限的属性,分别用到的函数是_____、_____、_____、_____。
3. 如果可以打开本地文件,其形式为_____;如果打开远程Web服务器上的文件,其形式为_____;如果打开远程FTP服务器上的文件,其形式为_____。
4. 读取一个文件中的某一个字符的函数为_____,可以读取文件某一行的内容的函数为_____。
5. 函数_____可以实现单行写入文件。
6. 函数_____用来查找指针位置,函数_____在文件中设定文件指针位置。
7. 用来打开文件的函数为_____,用来关闭打开的文件的函数是_____。
8. 创建目录的函数为_____,函数_____可以用来删除目录。
二、选择题
1. 以只读方式打开,将文件指针指向文件头的代码是( )。
A. r
B. r+
C. w
D. w+
2. 通过rewind()函数,可将指针设置到( )。
A. 文件结尾
B. 文件开头
C. 任意位置
D. 不能操作指针
3. 下面程序的运行结果为( )。
$fp=fopen(“many.txt”,”r”); //获得前15个字符 $date=fgets($fp,1); //获取当前指针 echo ftell($fp); fclose($fp);
A. 0
B. 1
C. 2
D. 程序有误
4. 多次运行下列程序,其运行结果为( )。
01 $dirname="php"; 02 $str=mkdir($dirname,10); 03 if($str) 04 echo"创建成功" 05 else 06 echo"创建失败";
A. 第02行发生编译错误
B. 输出“创建成功”
C. 输出“创建失败”
D. 输出“创建失败”并提示错误信息
三、简答题
1. 试说明文件处理的步骤。
2. 试列出打开文件的方式。
3. 说明如何向文件中写入数据。
四、编程题
1. 将获奖同学的名单输入到zhufu.txt文件下。
一等奖:王轮
二等奖:张静、李丽
三等奖:赵无、丁一、王六
2. 遍历C盘root文件,并输出该目录下文件的名称、文件的大小、文件类型、访问时间等信息。
共有条评论 网友评论