readdir

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

readdir从目录句柄读取条目

描述

readdir(?resource $dir_handle = null): string|false

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

参数

dir_handle

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

返回值

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

警告

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

变更日志

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

示例

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

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

<?php

if ($handle = opendir('/path/to/files')) {
echo
"Directory handle: $handle\n";
echo
"Entries:\n";

/* This is the correct way to loop over the directory. */
while (false !== ($entry = readdir($handle))) {
echo
"$entry\n";
}

/* This is the WRONG way to loop over the directory. */
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 条备注

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;
}
?>
Mark Simon
4 年前
PHP 包含优先级低于赋值的替代布尔运算符。这意味着以下形式的表达式

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

可以写成

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

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

<?php
while ($entry = readdir($handle) and $entry !== false) {
// etc
}
?>
(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 笔记说我的笔记太长了,所以请点击上面的链接之一获取它。
frasq at frasq dot org
13 年前
关于递归列出目录中所有文件的变体。该代码说明了一种基本技术:辅助函数的使用。它避免了构建在返回途中合并的临时列表。请注意,收集信息的数组必须通过引用传递。

<?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";
}
?>
stuart at horuskol dot net
13 年前
查看这些示例,我找不到任何对 opendir 返回的目录资源值进行简单检查的示例,该值随后被 readdir 使用。

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

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

<?php

$dir
= opendir($path);
while (
$dir && ($file = readdir($dir)) !== false) {
// do stuff
}

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

<?php
if ($handle = opendir('.')) {
while (
false !== ($file = readdir($handle))) {
if (
$file != "." && $file != ".." && $file != "Recursive Dir_Renfiles_dirname-filename.php") {
echo
"$file";
echo
"<br>";
$count = -1;
$handle2 = @opendir($file);
while (
false !== ($file2 = @readdir($handle2))) {
echo
"$file2";
if (
$count <10 ){ @rename("$file/$file2", "$file/$file"."_$file2");}
else { @
rename("$file/$file2", "$file/$file"."_$file2");}
echo
"<br>";
$count = $count + 1;
}
echo
"<br>";
}
}
closedir($handle);
}
?>
avi dot megladon at gmail dot com
12 年前
循环遍历文件夹和子文件夹,可以选择删除特定文件。

<?php
function listFolderFiles($dir,$exclude){
$ffs = scandir($dir);
echo
'<ul class="ulli">';
foreach(
$ffs as $ff){
if(
is_array($exclude) and !in_array($ff,$exclude)){
if(
$ff != '.' && $ff != '..'){
if(!
is_dir($dir.'/'.$ff)){
echo
'<li><a href="edit_page.php?path='.ltrim($dir.'/'.$ff,'./').'">'.$ff.'</a>';
} else {
echo
'<li>'.$ff;
}
if(
is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff,$exclude);
echo
'</li>';
}
}
}
echo
'</ul>';
}

listFolderFiles('.',array('index.php','edit_page.php'));
?>
stiles daht nathan ahat geemale
10 年前
我在 5.4.21 上,这个函数在空目录上返回 . 和 .. 之后返回 null。 ZendServer for IBMi
synnus at gmail dot com
4 年前
<?php

// if( $entry[0] != '.' ) best for ' . ' and ' .. '

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

?>
Mark Simon
4 年前
关于警告

此函数可能返回布尔值 FALSE,但也可能返回一个非布尔值,该值计算为 FALSE。

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

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



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

你可能会得到一个假的 false,就好像它本来就应该是这样。

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

根据

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

这似乎是唯一一个将被计算为 false 的字符串。
jpittman2 at gmail dot com
11 年前
在某些版本的 CentOS 上使用 readdir() 在 NFS 挂载的目录上时出现警告

这不是 PHP 的 readdir 的 bug,而是某些版本的 CentOS 的 readdir 实现的 bug。根据 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() 似乎不会受到这种漏洞的影响。
Kim Christensen
16 年前
一个方便的小函数,它返回目录下存在的文件(而不是目录)的数量。
选择是否希望函数通过第二个参数递归遍历子目录 -
默认模式(false)只是计算提供的路径下的直接文件。

<?php

/**
* 返回目录下驻留的文件数量。
*
* @return integer
* @param string (required) 您要开始的目录
* @param boolean (optional) 递归计数。默认值为 FALSE。
* @param integer (optional) 文件计数的初始值
*/

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 下的文件

?>
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);
}
}
?>
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/'));

?>

输出示例

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

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

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

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

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

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

)
(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);
?>
phpwizard-at-pech-dot-cz
22 年前
它应该可以工作,但最好先阅读 RFC 2616 中的第 13.1.3 节“缓存控制机制”,地址为 http://rfc.net/rfc2616.html,然后再开始使用代理,因为代理在你和客户端之间会造成混淆。

阅读它可以最佳地了解代理的工作原理,你应该如何修改文档的缓存相关头部,以及你永远不应该再做什么。:-)

当然,不阅读 RFC 是最好的方式,永远不会了解互联网的工作原理,也是模仿微软公司行为的最佳方式。

祝您愉快!
Jirka Pech
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;
}

// Usage
$dir = '/data';
$foo = getFilesFromDir($dir);

print_r($foo);
?>
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);
}
?>
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;
}
?>
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);

}
}

}

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

<?php
function listDirs($where){
echo
"<table border=\"1\"><tr><td><b>Name</b></td><td><b>Type</b></td>";
echo
"<td><b>Invisible (Hidden)?</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>Directory</td><td>No</td></tr>";
}else{
echo
"<tr><td>$item</td><td>File</td><td>No</td></tr>";
}
$i++;
}else{
if(
is_dir($item)){
echo
"<tr><td>$item</td><td>Directory</td><td>Yes</td></tr>";
}else{
echo
"<tr><td>$item</td><td>File</td><td>Yes</td></tr>";
}
$i++;
}
}
echo
"</table>";
}
?>
然后像这样调用它。
<?php
listDirs
(DIR);
?>
示例
<?php
listDirs
("/tests/directorylisting");
?>

您将获得一个这样的表格。

Name Type Invisible (Hidden)?
. Directory Yes
.. Directory Yes
.DS_Store File Yes
.localized File Yes
index.php File No
OOOLS Directory No
QwerpWiki.php File No
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;
}
?>
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];
?>

[注意:由 'ffd8' 在 19-JUN-09 提出的 bug 修复/类型修复]
DaveRandom
15 年前
一个非常灵活的函数,可以递归地列出目录中的所有文件,并可以选择对这些文件执行自定义操作集,或者在返回的数据中包含有关它们的额外信息。

----------

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

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

----------

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

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

----------

只需将您的代码插入下面注释指示的部分,然后就完成了!

以下示例返回所有项目的 filename、filepath 和 file modified time(以人类可读的字符串形式),返回所有文件(但不包括目录)的文件大小,以及所有包含 "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\nFILE (" . $file['dirpath'].'/'.$file['filename'] . "):\n\n" . fread($file['handle'], filesize($file['dirpath'].'/'.$file['filename']));
fclose($file['handle']);
}
}

?>
garvitdelhi at gmail dot com
9 年前
这个函数递归地进入特定深度,并在达到深度后停止。

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];
}
skysama at googles_email dot com
16 年前
又一种按扩展名查看文件的方案

/* 注意
* /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 );
?>
osamahussain897 at gmail dot com
6 年前
<?php
if ($handle = opendir('../')) {

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

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

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