19 与文件系统和服务器的交互 (2)
2016-08-25 12:39 yojiaku 阅读(186) 评论(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>
输出结果:

浙公网安备 33010602011771号