文章教程

第10章文件目录类

9/17/2020 9:34:15 PM 人评论 次浏览

第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 打开文件的模式

016-01

如下语句是利用函数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所示的运行程序后的结果。

015-01

图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";  
?>
c1

图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所示。

010-01 011-02
图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所示。读取的是上个例子中的文件内容。

015-01

图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所示。

015-01

图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所示。

4 5 5
图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次后的结果。

010-01 011-02
图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所示。

015-01

图10.12 程序运行结果

【实例10-2】PHP中关于文件操作的函数很多,涉及到文件的读取、写入、属性、信息、状态等操作。本实例代码中使用到的函数主要包括:fopen()、fread、fwrite()、fclose()、file_get_contents()、file_put_contents()。

(1)fopen()函数用于打开一个文件句柄。其有两个必选参数:

  • 参数一的值是需要打开的文件名称。
  • 参数二的值用于指定打开文件的方式,其取值如表10.1所示。

表10.1 打开文件方式

016-01

(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所示。

015-01

图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所示。

015-01

图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文件,并输出该目录下文件的名称、文件的大小、文件类型、访问时间等信息。

教程类别