19 与文件系统和服务器的交互 (2)
2016-08-25 12:39 yojiaku 阅读(179) 评论(0) 编辑 收藏 举报19.2 使用目录函数
主要是让目录也能出现在浏览器中,这样就能知晓用户已经上传了什么文件了,对此功能书上介绍了3种方法。循环渐进,现在一起来看看并学习一下这3个方法,比较它们之间的异同:
方法一:使用opendir(), cloasedir(), readddir()
函数opendir()用于打开所浏览的目录(即存放上传文件的目录),这类似于函数fopen()打开所读取的文件,不同的是,传递给此函数的参数不是文件名称(file),而是目录名称(directory):
$dir = opendir($current_dir);
该函数返回一个目录句柄。
在目录打开后,可以通过调用函数readdir($dir)从目录中读取文件。
当该目录没有可读的文件时,此函数将返回false。(注意:当此函数读取到一个名为“0”的文件时,也会返回false,为了确保这一点,可以通过测试来确定返回值是否为false:
while(false != ($file = readdir($dir)); )
当完成从目录中读取文件的步骤后,可以通过调用函数closedir($dir)来关闭该目录,这类似于函数fclose()来关闭文件。
这是一个例子:程序清单19-3 browsedir.php —— 能够列出上传文件的目录
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Browse Diretories</title> </head> <body> <h1>Browsing</h1> <?php $current_dir = 'uploads/'; $dir = opendir($current_dir); echo "<p>Upload diretory is $current_dir</p>"; echo "<p>Directory listing:</p><ul>"; while(false !== ($file = readdir($dir))) { // strip out the two entries of . and .. if($file != "." && $file != "..") { echo "<li>$file</li>"; } } echo "</ul>"; closedir($dir); ?> </body> </html>
输出结果:
方法二:使用PHP提供的dir类,该类具有handle和path属性,以及read(), close(), rewind()方法
dir()函数用于读取一个目录,包含如下:
· 给定的要打开的目录
· dir() 的 handle 和 path 两个属性是可用的($dir->handle; $dir->path)
· handle 和 path 属性有三个方法:read(), rewind(), close()
语法:dir(directory, context);
其中directory 是必须得,规定打开的目录; context 是可选的
例子:程序清单19-4 browsedir2.php —— 使用dir类显示目录列表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Browse Directories</title> </head> <body> <h1>Browsing</h1> <?php $dir = dir("uploads/"); // 返回要读取的文件目录 echo "<p>Handle is $dir->handle</p>"; // 调用对象的handle属性,返回一个对象标识符 echo "<p>Upload directory is $dir->path</p>"; // 调用对象的path属性,显示当前的目录 echo "<p>Directory Listing:</p><ul>"; while(false !== ($file = $dir->read())) // 调用对象的read方法,若成功返回一个文件名,指针向下移动(一个目录的遍历) { //strip out the two entries of . and .. if($file != "." && $file != "..") { echo "<li>$file</li>"; } } echo "</ul>"; $dir->close(); // 调用对象的close方法,关闭目录 ?> </body> </html>
输出结果:
方法三:书中说以上文件名称没有以任何顺序保存,实际上它们已经是以字母表顺序保存了的,因为我们的文件管理系统在保存这些文件的时候已经按顺序保存了,所以第三个方法就有点画蛇添足了
不过,还是要了解一下,因为它还可以按照降序排列:程序清单 19-5 scandir.php —— 使用scandir()函数对文件名称进行字母表方式排序
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Browse Diretories</title> </head> <body> <h1>Browsing</h1> <?php $dir = "uploads/"; $file1 = scandir($dir); $file2 = scandir($dir, 1); echo "<p>Upload directory is $dir</p>"; echo "<p>Directory listing in alphabetical order, ascending:</p><ul>"; // 升序排列 foreach($file1 as $file) { if($file != "." && $file != "..") { echo "<li>$file</li>"; } } echo "</ul>"; echo "<p>Upload directory is $dir</p>"; echo "<p>Directory listing in alphabetical order, descending:</p><ul>"; // 降序排列 foreach($file2 as $file) { if($file != "." && $file != "..") { echo "<li>$file</li>"; } } echo "</ul>"; ?> </body> </html>
输出结果: