PHP Conference Japan 2024

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 現在可以為 null。

範例

範例 #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
* @return 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) {
// etc
}
?>
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
函式 listdir($dir='.') {
如果 (!
is_dir($dir)) {
返回
false;
}

$files = 陣列();
listdiraux($dir, $files);

返回
$files;
}

函式
listdiraux($dir, &$files) {
$handle = opendir($dir);
如果 (
$handle === false) {
返回;
}
當 ((
$file = readdir($handle)) !== false) {
如果 (
$file == '.' || $file == '..') {
繼續;
}
$filepath = $dir == '.' ? $file : $dir . '/' . $file;
如果 (
is_link($filepath))
繼續;
如果 (
is_file($filepath))
$files[] = $filepath;
否則如果 (
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
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);
}
?>
1
avi dot megladon at gmail dot com
12 年前
循環遍歷資料夾和子資料夾,並可選擇移除特定檔案。

<?php
函數 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'));
?>
0
stiles daht nathan ahat geemale
10 年前
我在使用 5.4.21 版本時,這個函數在空目錄中,處理完「.」和「..」之後會返回 null。我使用的是 ZendServer for IBMi。
-1
synnus at gmail dot com
5 年前
<?php

// 如果 $entry[0] 不為 '.',最適用於 '.' 和 '..'

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

?>
-1
Mark Simon
5 年前
關於警告訊息

此函式可能會返回布林值 FALSE,但也可能返回評估為 FALSE 的非布林值。

當然,這意味著如果您使用

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



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

您可能會得到一個假的 false,可以這麼說。

據我所知,唯一會真正發生這種情況的時機是當您遇到項目為 0 時。

根據

https://php.dev.org.tw/manual/en/language.types.boolean.php#language.types.boolean.casting

這似乎是唯一會評估為 false 的字串。
0
jpittman2 at gmail dot com
11 年前
在 NFS 掛載的目錄上某些版本的 CentOS 上使用 readdir() 時的警告

這不是 PHP 的 readdir 的錯誤,而是某些版本 CentOS 的 readdir 實作的錯誤。根據 CentOS 錯誤論壇中的文章 #6213,在核心版本 2.6.18-348 到 2.6.18-348.3.1 的 CentOS 上,在 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
函數 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] => 資料夾
[time] => 2007 年 5 月 28 日 01:55:02
)

[1] => 陣列
(
[name] => classes
[size] => 0
[perm] => drwxrwxrwx
[type] => 資料夾
[time] => 2007 年 5 月 26 日 00:56:44
)

[2] => 陣列
(
[name] => config.inc.php
[size] => 143
[perm] => -rw-rw-rw-
[type] => 檔案
[time] => 2007 年 5 月 26 日 13:13:19
)

[3] => 陣列
(
[name] => index.php
[size] => 131
[perm] => -rw-rw-rw-
[type] => 檔案
[time] => 2007 年 5 月 26 日 22:15:18
)

[4] => 陣列
(
[name] => modules
[size] => 0
[perm] => drwxrwxrwx
[type] => 資料夾
[time] => 2007 年 5 月 28 日 00:47:40
)

[5] => 陣列
(
[name] => temp
[size] => 0
[perm] => drwxrwxrwx
[type] => 資料夾
[time] => 2007 年 5 月 28 日 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
函數 get_dirs($dir){
全域
$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' 在 2009 年 6 月 19 日提出的錯誤修正/拼字修正。]
-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);

//---------------------------------------------------------//
// - SECTION 1 - //
// Actions to be performed on ALL ITEMS //
//----------------- Begin Editable ------------------//

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

//----------------- End Editable ------------------//
do if (!is_dir($path)) {
//---------------------------------------------------------//
// - SECTION 2 - //
// Actions to be performed on FILES ONLY //
//----------------- Begin Editable ------------------//

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

//----------------- End Editable ------------------//
break;
} else {
//---------------------------------------------------------//
// - SECTION 3 - //
// Actions to be performed on DIRECTORIES ONLY //
//----------------- Begin Editable ------------------//

//----------------- End Editable ------------------//
break;
} while (
FALSE);
$list[] = $entry;
}
}
}
closedir($handle);
return
$list;
} else return
FALSE;
}

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

// Output each opened file and then close
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']);
}
}

?>
-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