代码改变世界

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>

  输出结果: