PHP Conference Japan 2024

readdir

(PHP 4, PHP 5, PHP 7, PHP 8)

readdir从目录句柄读取条目

描述

readdir(?资源 $dir_handle = null): 字符串|false

返回目录中下一个条目的名称。条目按文件系统存储的顺序返回。

参数

dir_handle

之前使用 opendir() 打开的目录句柄 资源。如果未指定目录句柄,则假定 opendir() 最后打开的链接。

返回值

成功时返回条目名称,失败时返回 false

警告

此函数可能会返回布尔值 false,但也可能会返回计算结果为 false 的非布尔值。有关更多信息,请阅读关于 布尔值 的部分。使用 === 运算符 测试此函数的返回值。

变更日志

版本 描述
8.0.0 dir_handle 现在可以为空。

示例

示例 #1 列出目录中的所有条目

请注意下面示例中检查 readdir() 返回值的方式。我们明确地测试其返回值是否与 (等于且类型相同 - 有关更多信息,请参阅 比较运算符) false 相同,否则,任何名称计算结果为 false 的目录条目都将停止循环(例如,名为“0”的目录)。

<?php

if ($handle = opendir('/path/to/files')) {
echo
"目录句柄:$handle\n";
echo
"条目:\n";

/* 这是遍历目录的正确方法。 */
while (false !== ($entry = readdir($handle))) {
echo
"$entry\n";
}

/* 这是遍历目录的错误方法。 */
while ($entry = readdir($handle)) {
echo
"$entry\n";
}

closedir($handle);
}
?>

示例 #2 列出当前目录中的所有条目并去除 ...

<?php
if ($handle = opendir('.')) {
while (
false !== ($entry = readdir($handle))) {
if (
$entry != "." && $entry != "..") {
echo
"$entry\n";
}
}
closedir($handle);
}
?>

参见

  • is_dir() - 判断文件名是否为目录
  • glob() - 查找与模式匹配的文件名
  • opendir() - 打开目录句柄
  • scandir() - 列出指定路径内的文件和目录

添加注释

用户贡献的注释 29 条注释

37
sreekumar [at] sreek [dot] in
13 年前
我创建了一个函数,用于非递归地获取给定文件夹的所有文件和文件夹(包括子目录)的路径。
虽然我没有完全测试它,但它似乎可以工作。



<?php

/**
* 查找给定目录及其子目录中所有文件和目录的路径,相对于给定的根文件夹,非递归。
* 将返回以下形式的数组:
* array(
* 'files' => [],
* 'dirs' => [],
* )
* @author sreekumar
* @param string $root
* @result array
*/
function read_all_files($root = '.'){
$files = array('files'=>array(), 'dirs'=>array());
$directories = array();
$last_letter = $root[strlen($root)-1];
$root = ($last_letter == '\\' || $last_letter == '/') ? $root : $root.DIRECTORY_SEPARATOR;

$directories[] = $root;

while (
sizeof($directories)) {
$dir = array_pop($directories);
if (
$handle = opendir($dir)) {
while (
false !== ($file = readdir($handle))) {
if (
$file == '.' || $file == '..') {
continue;
}
$file = $dir.$file;
if (
is_dir($file)) {
$directory_path = $file.DIRECTORY_SEPARATOR;
array_push($directories, $directory_path);
$files['dirs'][] = $directory_path;
} elseif (
is_file($file)) {
$files['files'][] = $file;
}
}
closedir($handle);
}
}

return
$files;
}
?>
1
Mark Simon
5 年前
PHP 包含优先级低于赋值的替代布尔运算符。这意味着以下形式的表达式

<?php
if(($a = something()) && $a !== false) ;
?>

可以写成

<?php
if($a = something() and $a !== false) ;
?>

在这种情况下,循环可以写成

<?php
while ($entry = readdir($handle) and $entry !== false) {
// 等等
}
?>
4
(Qube#php@Efnet)
17 年前
这是 preg_find() 的更新版本[多年来已从 glob() 手册页链接] - 此函数应提供您从读取文件、目录、不同的排序方法、递归以及可能最强大的所有功能中获得的大部分内容,即使用 PCRE 正则表达式进行模式匹配的能力。

您可以在此处获取 preg_find: http://www.pgregg.com/projects/php/preg_find/preg_find.php.txt
或者如果您更喜欢彩色的 .phps 格式: http://www.pgregg.com/projects/php/preg_find/preg_find.phps
或向下滚动到此注释的末尾。

我在我的博客上写了一些关于如何使用它的示例: http://www.pgregg.com/forums/viewtopic.php?tid=73

简单的 glob() 类型替换
$files = preg_find('/./', $dir);

递归?
$files = preg_find('/./', $dir, PREG_FIND_RECURSIVE);

模式匹配?查找所有 .php 文件
$files = preg_find('/\.php$/D', $dir, PREG_FIND_RECURSIVE);

按字母顺序排序?
$files = preg_find('/\.php$/D', $dir, PREG_FIND_RECURSIVE|PREG_FIND_SORTKEYS);

按文件大小排序,降序?
$files = preg_find('/./', $dir,
PREG_FIND_RECURSIVE|PREG_FIND_RETURNASSOC |PREG_FIND_SORTFILESIZE|PREG_FIND_SORTDESC);
$files=array_keys($files);

按修改日期排序?
$files = preg_find('/./', $dir,
PREG_FIND_RECURSIVE|PREG_FIND_RETURNASSOC |PREG_FIND_SORTMODIFIED);
$files=array_keys($files);

好的,PHP 注释说我的注释太长了,所以请点击上面链接之一获取它。
8
frasq at frasq dot org
14 年前
递归列出目录中所有文件的变体。代码说明了一种基本技术:辅助函数的使用。它避免了构建在返回途中合并的临时列表。请注意,收集信息的数组必须通过引用传递。

<?php
function listdir($dir='.') {
if (!
is_dir($dir)) {
return
false;
}

$files = array();
listdiraux($dir, $files);

return
$files;
}

function
listdiraux($dir, &$files) {
$handle = opendir($dir);
while ((
$file = readdir($handle)) !== false) {
if (
$file == '.' || $file == '..') {
continue;
}
$filepath = $dir == '.' ? $file : $dir . '/' . $file;
if (
is_link($filepath))
continue;
if (
is_file($filepath))
$files[] = $filepath;
else if (
is_dir($filepath))
listdiraux($filepath, $files);
}
closedir($handle);
}

$files = listdir('.');
sort($files, SORT_LOCALE_STRING);

foreach (
$files as $f) {
echo
$f, "\n";
}
?>
7
stuart at horuskol dot net
13 年前
浏览这些示例,我没有看到任何对 opendir 返回的目录资源值进行简单检查,并且随后由 readdir 使用。

如果 opendir 返回 false,并且您只是将它传递给 while 循环中的 readdir 调用,您将得到一个无限循环。

一个简单的测试有助于防止这种情况

<?php

$dir
= opendir($path);
while (
$dir && ($file = readdir($dir)) !== false) {
// 执行操作
}

?>
1
Mauro Alessandro Nonnis
13 年前
## 使用“递归目录名称”作为模板 + 文件名,列出和重命名所有递归目录上的文件
## 建议:同一目录中的其他文件将导致警告
## 脚本名称:Recursive Dir_Renfiles_dirname-filename.php

<?php
如果 ($handle = opendir('.')) {
当 (
false !== ($file = readdir($handle))) {
如果 (
$file != "." && $file != ".." && $file != "Recursive Dir_Renfiles_dirname-filename.php") {
echo
"$file";
echo
"<br>";
$count = -1;
$handle2 = @opendir($file);
当 (
false !== ($file2 = @readdir($handle2))) {
echo
"$file2";
如果 (
$count <10 ){ @rename("$file/$file2", "$file/$file"."_$file2");}
否则 { @
rename("$file/$file2", "$file/$file"."_$file2");}
echo
"<br>";
$count = $count + 1;
}
echo
"<br>";
}
}
closedir($handle);
}
?>
1
[email protected]
12年前
循环遍历文件夹和子文件夹,并可以选择删除特定文件。

<?php
函数 listFolderFiles($dir,$exclude){
$ffs = scandir($dir);
echo
'<ul class="ulli">';
遍历 (
$ffs 作为 $ff){
如果 (
is_array($exclude) 并且 !in_array($ff,$exclude)){
如果 (
$ff != '.' && $ff != '..'){
如果 (!
is_dir($dir.'/'.$ff)){
echo
'<li><a href="edit_page.php?path='.ltrim($dir.'/'.$ff,'./').'">'.$ff.'</a>';
} 否则 {
echo
'<li>'.$ff;
}
如果 (
is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff,$exclude);
echo
'</li>';
}
}
}
echo
'</ul>';
}

listFolderFiles('.',array('index.php','edit_page.php'));
?>
0
[email protected]
10年前
我在 5.4.21 上,此函数在空目录上的 . 和 .. 之后返回 null。IBM i 的 ZendServer
-1
[email protected]
5 年前
<?php

// if( $entry[0] != '.' ) 最适合 ' . ' 和 ' .. '

$d = dir( '.' );
echo
"指针 : " . $d->handle . "\n";
echo
"路径 : " . $d->path . "\n";
当 (
false !== ($entry = $d->read())) {
如果 (
$entry[0] != '.') {
echo
$entry, PHP_EOL;
}
}
$d->close();

?>
-1
Mark Simon
5 年前
关于警告

此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。

当然,这意味着如果您使用

<?php
如果 ($entry = readdir($handle) == false)
?>



<?php
当 ($entry = readdir($handle))
?>

您可能会得到一个错误的 false,就好像它那样。

据我所知,实际上发生这种情况的唯一时间是当您遇到一个值为 0 的条目时。

根据

https://php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

这似乎是唯一一个计算结果为 false 的字符串。
0
[email protected]
11年前
在 CentOS 的某些版本上使用 NFS 挂载的目录时出现 readdir() 警告

这不是 PHP 的 readdir 的错误,而是 CentOS 的 readdir 实现的某些版本的错误。根据 CentOS Bugs 论坛中的帖子 #6213,当使用 CentOS 内核版本 2.6.18-348 到 2.6.18-348.3.1 时,在 NFS 挂载的目录上调用 readdir 可能不会返回所有条目。由于 PHP 的 readdir() 使用此库,因此问题在 PHP 中也表现出来。

根据该帖子,升级到 2.6.18-348.4.1.el5 版本应该可以解决此问题,尽管我还没有尝试过。

glob() 似乎没有受到同样的漏洞影响。
0
Kim Christensen
16年前
一个方便的小函数,返回目录下存在的文件(而不是目录)的数量。
选择是否希望函数使用第二个参数递归遍历子目录 -
默认模式(false)只是计算提供的路径下直接的文件。



<?php

/**
* 返回目录下文件的数量。
*
* @return integer
* @param string (必填) 您想要开始的目录
* @param boolean (可选) 递归计数。默认为 FALSE。
* @param integer (可选) 文件计数的初始值
*/

function num_files($dir, $recursive=false, $counter=0) {
static
$counter;
if(
is_dir($dir)) {
if(
$dh = opendir($dir)) {
while((
$file = readdir($dh)) !== false) {
if(
$file != "." && $file != "..") {
$counter = (is_dir($dir."/".$file)) ? num_files($dir."/".$file, $recursive, $counter) : $counter+1;
}
}
closedir($dh);
}
}
return
$counter;
}

// 用法:
$nfiles = num_files("/home/kchr", true); // 统计 /home/kchr 下的所有文件,包括子目录
$nfiles = num_files("/tmp"); // 统计 /tmp 下的直接文件

?>
0
info at agentur-obermaier dot de
16年前
这是一个很好的快速完整目录读取 - 对不起,我的英语不好;)

<?php
function ReadDirs($dir,$em){
if (
$handle = opendir($dir)) {
while (
false !== ($file = readdir($handle))) {
if (
$file != "." && $file != ".." && $file != "Thumb.db") {
if(
is_dir($dir.$file)){
echo
$em."&raquo; ".$file.'<br>';
ReadDirs($dir.$file."/",$em."&nbsp;&nbsp;");
}
}
}
closedir($handle);
}
}
?>
0
schursin at gmail[deleteme] dot com
17 年前
代码

<?php

function permission($filename)
{
$perms = fileperms($filename);

if ((
$perms & 0xC000) == 0xC000) { $info = 's'; }
elseif ((
$perms & 0xA000) == 0xA000) { $info = 'l'; }
elseif ((
$perms & 0x8000) == 0x8000) { $info = '-'; }
elseif ((
$perms & 0x6000) == 0x6000) { $info = 'b'; }
elseif ((
$perms & 0x4000) == 0x4000) { $info = 'd'; }
elseif ((
$perms & 0x2000) == 0x2000) { $info = 'c'; }
elseif ((
$perms & 0x1000) == 0x1000) { $info = 'p'; }
else {
$info = 'u'; }

// 文件所有者
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-'));

// 文件组
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-'));

// 其他用户
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-'));

return
$info;
}

function
dir_list($dir)
{
if (
$dir[strlen($dir)-1] != '/') $dir .= '/';

if (!
is_dir($dir)) return array();

$dir_handle = opendir($dir);
$dir_objects = array();
while (
$object = readdir($dir_handle))
if (!
in_array($object, array('.','..')))
{
$filename = $dir . $object;
$file_object = array(
'name' => $object,
'size' => filesize($filename),
'perm' => permission($filename),
'type' => filetype($filename),
'time' => date("d F Y H:i:s", filemtime($filename))
);
$dir_objects[] = $file_object;
}

return
$dir_objects;
}

?>

调用

<?php

print_r
(dir_list('/path/to/you/dir/'));

?>

输出示例

数组
(
[0] => 数组
(
[name] => api
[size] => 0
[perm] => drwxrwxrwx
[type] => dir
[time] => 28 May 2007 01:55:02
)

[1] => 数组
(
[name] => classes
[size] => 0
[perm] => drwxrwxrwx
[type] => dir
[time] => 26 May 2007 00:56:44
)

[2] => 数组
(
[name] => config.inc.php
[size] => 143
[perm] => -rw-rw-rw-
[type] => file
[time] => 26 May 2007 13:13:19
)

[3] => 数组
(
[name] => index.php
[size] => 131
[perm] => -rw-rw-rw-
[type] => file
[time] => 26 May 2007 22:15:18
)

[4] => 数组
(
[name] => modules
[size] => 0
[perm] => drwxrwxrwx
[type] => dir
[time] => 28 May 2007 00:47:40
)

[5] => 数组
(
[name] => temp
[size] => 0
[perm] => drwxrwxrwx
[type] => dir
[time] => 28 May 2007 04:49:33
)

)
0
(Qube#php@Efnet)
17 年前
<?php

// 示例函数,递归返回目录中的所有文件。
// http://www.pgregg.com/projects/php/code/recursive_readdir.phps

Function listdir($start_dir='.') {

$files = array();
if (
is_dir($start_dir)) {
$fh = opendir($start_dir);
while ((
$file = readdir($fh)) !== false) {
# 循环遍历文件,跳过 . 和 ..,并在必要时递归
if (strcmp($file, '.')==0 || strcmp($file, '..')==0) continue;
$filepath = $start_dir . '/' . $file;
if (
is_dir($filepath) )
$files = array_merge($files, listdir($filepath));
else
array_push($files, $filepath);
}
closedir($fh);
} else {
# 如果函数被无效的非目录参数调用则返回 false
$files = false;
}

return
$files;

}

$files = listdir('.');
print_r($files);
?>
0
phpwizard-at-pech-dot-cz
22 年前
它应该可以工作,但在你开始使用代理之前,最好阅读 RFC 2616 的第 13.1.3 节“缓存控制机制”(可在 http://rfc.net/rfc2616.html 获取),因为它们可能会让你和客户端之间的通信变得混乱。

阅读它是了解代理如何工作、如何修改文档的缓存相关头以及以后永远不应该做什么的最佳方式。:-)

当然,不阅读 RFC 是永远无法学习互联网如何工作以及模仿微软公司的最佳方式。

祝您有愉快的一天!
Jirka Pech
-1
mrlemonade
13 年前
获取递归目录中的所有文件到一个数组中。



<?php
/*
* mrlemonade ~
*/

function getFilesFromDir($dir) {

$files = array();
if (
$handle = opendir($dir)) {
while (
false !== ($file = readdir($handle))) {
if (
$file != "." && $file != "..") {
if(
is_dir($dir.'/'.$file)) {
$dir2 = $dir.'/'.$file;
$files[] = getFilesFromDir($dir2);
}
else {
$files[] = $dir.'/'.$file;
}
}
}
closedir($handle);
}

return
array_flat($files);
}

function
array_flat($array) {

foreach(
$array as $a) {
if(
is_array($a)) {
$tmp = array_merge($tmp, array_flat($a));
}
else {
$tmp[] = $a;
}
}

return
$tmp;
}

// 用法
$dir = '/data';
$foo = getFilesFromDir($dir);

print_r($foo);
?>
-1
hanan dot ali dot shaikh at gmail dot com
15 年前
此函数用于显示随机图像,例如网站页眉位置。它读取整个目录,然后随机打印图像。我认为它可能对某些人有用。

<?php
if ($handle = opendir('images/')) {
$dir_array = array();
while (
false !== ($file = readdir($handle))) {
if(
$file!="." && $file!=".."){
$dir_array[] = $file;
}
}
echo
$dir_array[rand(0,count($dir_array)-1)];
closedir($handle);
}
?>
-1
hotrungdungit at gmail dot com
15 年前
下面将返回目录中文件名和文件夹的数组

<?php
function ReadFolderDirectory($dir = "root_dir/here")
{
$listDir = array();
if(
$handler = opendir($dir)) {
while ((
$sub = readdir($handler)) !== FALSE) {
if (
$sub != "." && $sub != ".." && $sub != "Thumb.db") {
if(
is_file($dir."/".$sub)) {
$listDir[] = $sub;
}elseif(
is_dir($dir."/".$sub)){
$listDir[$sub] = $this->ReadFolderDirectory($dir."/".$sub);
}
}
}
closedir($handler);
}
return
$listDir;
}
?>
-1
sergio dot barrios at upr dot edu dot cu
8 年前
在目录中查找文件或文件夹。假设我们希望通过根目录的所有子目录循环 n 次,并查找特定文件夹或文件并了解其地址。

在我的案例中,我需要在 Calibre 库的目录 metadata.opf 中找到每个现有文件,并获取每个文档的所有数据,如果我们认为此目录有 20,000 个文件夹,作者是一项不可能手动完成的任务。此递归算法实现了我的家庭作业。我希望它能帮助你。

<?php

$root
= '../Classes';
$search_parameter = "CachedObjectStorageFactory.php";

//如果我们调用函数 spider 作为 spider($root);
//将显示所有目录内容,包括子目录

//如果我们调用函数 spider 作为 spider('../Classes', 'Shared');
//并将显示目录的地址

spider($root, $search_parameter);
closedir();

function
spider($dir,$fileName=""){

$handle = opendir($dir);

while(
$file= readdir($handle)){

if(
$file != "." && $file != ".."){

if(
$fileName=="")
echo
$dir."/".$file."<br>";
else
if(
$file == $fileName)
echo
$dir."/".$file."<br>";


if(!
is_file($dir."/".$file))
spider($dir."/".$file,$fileName);

}
}

}

?>
-3
Blizzz
11年前
如果 dir_handle 不是有效的资源,则将返回 null 而不是 false。
-2
Qwerp
14 年前
这是一个方便的函数,您可以使用它来列出您指定的目录中的文件、它们的类型(目录或文件)以及它们是否隐藏。
您也可以修改它来执行其他操作。

<?php
function listDirs($where){
echo
"<table border=\"1\"><tr><td><b>名称</b></td><td><b>类型</b></td>";
echo
"<td><b>不可见(隐藏)?</b></td></tr>";
$itemHandler=opendir($where);
$i=0;
while((
$item=readdir($itemHandler)) !== false){
if(
substr($item, 0, 1)!="."){
if(
is_dir($item)){
echo
"<tr><td>$item</td><td>目录</td><td>否</td></tr>";
}else{
echo
"<tr><td>$item</td><td>文件</td><td>否</td></tr>";
}
$i++;
}else{
if(
is_dir($item)){
echo
"<tr><td>$item</td><td>目录</td><td>是</td></tr>";
}else{
echo
"<tr><td>$item</td><td>文件</td><td>是</td></tr>";
}
$i++;
}
}
echo
"</table>";
}
?>
然后像这样调用它。
<?php
listDirs
(DIR);
?>
示例
<?php
listDirs
("/tests/directorylisting");
?>

您将获得如下表格。

名称 类型 不可见(隐藏)?
. 目录 是
.. 目录 是
.DS_Store 文件 是
.localized 文件 是
index.php 文件 否
OOOLS 目录 否
QwerpWiki.php 文件 否
-2
yasirlayth at live dot com
14 年前
此简单函数将索引给定目录及其子目录。

<?php
function get_dirs($dir){
global
$dirs;
if (!isset(
$dirs)){$dirs = '';}
if(
substr($dir,-1) !== '\\'){$dir .= '\\';}
if (
$handle = opendir($dir)){
while (
false !== ($file = readdir($handle))){
if (
filetype($dir.$file) === 'dir' && $file != "." && $file != ".."){
clearstatcache();
$dirs .= $file . "\n";
get_dirs($dir . $file);
}
}
closedir($handle);
}
return
$dirs;
}
?>
-2
HeadRoom
15 年前
我想我会包含我编写的从目录中获取随机图像的代码。

<?php
$image_dir
= 'images';
$count = 0;
if (
$handle = opendir($image_dir)) {
$retval = array();
while (
false !== ($file = readdir($handle))) {
if ((
$file <> ".") && ($file <> "..")) {
$retval[$count] = $file;
$count = $count + 1;
}
}

closedir($handle);
}
shuffle($retval);
$current_image = $retval[0];
?>

[由 danbrown AT php DOT net 注:包含受 'ffd8' 在 19-JUN-09 启发的错误修复/错别字修复。]
-4
DaveRandom
15 年前
一个非常灵活的函数,可以递归列出目录中的所有文件,并可以选择对这些文件执行自定义的操作集和/或在返回的数据中包含有关它们的额外信息。

----------

语法
$array = process_dir ( $dir , $recursive = FALSE )
$dir (字符串) = 要处理的目录
$recursive (布尔值) = [可选] 如果设置为 TRUE 则为递归

返回值
该函数返回一个索引数组,每个文件一个条目。每个条目都是一个关联数组,包含基本信息“filename”(文件名)和“dirpath”(文件路径的目录组件),以及您配置的任何其他键。如果失败则返回 FALSE。

----------

为了允许您配置另一个键,每个文件的条目都存储在一个数组中,“$entry”用于每次迭代。您可以使用 $entry['keyname'] = ... 轻松返回给定文件的任何其他数据(请注意,此数据可以是任何变量类型 - 字符串、布尔值、浮点数、资源等)

有一个字符串变量“$path”可用,它包含当前文件的完整路径,相对于函数调用时提供的初始“$dir”。此数据也可在它的组成部分“$dir”和“$file”中获得。每个文件的操作可以根据这些变量构建。在您的代码中不应使用变量“$list”、“$handle”和“$recursive”。

----------

只需将您的代码插入到下面注释指示的部分,然后就可以使用了!

以下示例返回所有项目的名称、文件路径和文件修改时间(以人类可读的字符串表示),所有文件(但目录除外)的文件大小,以及所有文件名中包含“log”(但不是 *.log 文件)的文件的资源流。

<?php

function process_dir($dir,$recursive = FALSE) {
if (
is_dir($dir)) {
for (
$list = array(),$handle = opendir($dir); (FALSE !== ($file = readdir($handle)));) {
if ((
$file != '.' && $file != '..') && (file_exists($path = $dir.'/'.$file))) {
if (
is_dir($path) && ($recursive)) {
$list = array_merge($list, process_dir($path, TRUE));
} else {
$entry = array('filename' => $file, 'dirpath' => $dir);

//---------------------------------------------------------//
// - 第 1 部分 - //
// 对所有项目执行的操作 //
//----------------- 可编辑开始 ------------------//

$entry['modtime'] = filemtime($path);

//----------------- 可编辑结束 ------------------//
do if (!is_dir($path)) {
//---------------------------------------------------------//
// - 第 2 部分 - //
// 仅对文件执行的操作 //
//----------------- 可编辑开始 ------------------//

$entry['size'] = filesize($path);
if (
strstr(pathinfo($path,PATHINFO_BASENAME),'log')) {
if (!
$entry['handle'] = fopen($path,r)) $entry['handle'] = "FAIL";
}

//----------------- 可编辑结束 ------------------//
break;
} else {
//---------------------------------------------------------//
// - 第 3 部分 - //
// 仅对目录执行的操作 //
//----------------- 可编辑开始 ------------------//

//----------------- 可编辑结束 ------------------//
break;
} while (
FALSE);
$list[] = $entry;
}
}
}
closedir($handle);
return
$list;
} else return
FALSE;
}

$result = process_dir('C:/webserver/Apache2/httpdocs/processdir',TRUE);

// 输出每个打开的文件,然后关闭
foreach ($result as $file) {
if (
is_resource($file['handle'])) {
echo
"\n\n文件 (" . $file['dirpath'].'/'.$file['filename'] . "):\n\n" . fread($file['handle'], filesize($file['dirpath'].'/'.$file['filename']));
fclose($file['handle']);
}
}

?>
-3
garvitdelhi at gmail dot com
10年前
此函数递归到特定深度,并在达到深度后停止。

function read_path($root = '.', $depth = 1) {
if($depth == 0) {
return;
}
$last_letter = $root[strlen($root)-1];
$root = ($last_letter == '\\' || $last_letter == '/') ? $root : $root.DIRECTORY_SEPARATOR;
$files = array('files'=>array(), 'dirs'=>array());
if ($handle = opendir($root)) {
while (false !== ($file = readdir($handle))) {
if ($file == '.' || $file == '..') {
continue;
}
$file = $root.$file;
if (is_dir($file)) {
$directory_path = $file.DIRECTORY_SEPARATOR;


$files['dirs'][$directory_path] = NULL;
} elseif (is_file($file)) {
$files['files'][] = $file;
}
}
closedir($handle);
}
$done = [$root=>$files];
foreach ($done[$root]['dirs'] as $key=>$value) {
$done[$root]['dirs'][$key] = $this->read_path($key, $depth-1);
}
return $done[$root];
}
-4
skysama at googles_email dot com
17 年前
另一种按扩展名查看文件的方式

/* 注意
* /a-d = 不包含目录
* /b = 以简洁模式显示文件(不显示日期或文件大小)
*/

<?php
$dir
= '.\\img\\'; // 提示:转义斜杠
$filetype = "*.png";
$filelist = shell_exec( "dir {$dir}{$filetype} /a-d /b" );
$file_arr = explode( "\n", $filelist );
array_pop( $file_arr ); // 最后一行总是空的
print_r( $file_arr );
?>
-3
osamahussain897 at gmail dot com
6 年前
<?php
if ($handle = opendir('../')) {

while(
$entry = readdir($handle)){
$ent[] = $entry;
}

echo
$ent[0]; // 访问自定义目录或文件;
closedir($handle);
}
?>
-3
craig dot edwards at comech dot co dot uk
6 年前
请注意,readdir() 和 opendir() 等函数在某些操作系统上会自动返回排序后的目录列表,而在其他操作系统上则不会。

在较新版本的 Windows 上,通常可以保证 readdir() 返回按字母顺序排序的文件列表,而在 Linux 上则没有这种保证。如果您需要任何特定的排序顺序,则应将结果读取到数组中,并使用 asort() 或 rsort() 等函数对其进行排序,以使结果达到您需要的顺序。
To Top