目录函数

另请参见

有关相关函数(例如 dirname()is_dir()mkdir()rmdir()),请参阅 文件系统 部分。

目录

  • chdir — 更改目录
  • chroot — 更改根目录
  • closedir — 关闭目录句柄
  • dir — 返回 Directory 类的实例
  • getcwd — 获取当前工作目录
  • opendir — 打开目录句柄
  • readdir — 从目录句柄读取条目
  • rewinddir — 倒回目录句柄
  • scandir — 列出指定路径内的文件和目录
添加注释

用户贡献注释 7 notes

11
dkflbk at nm dot ru
17 年前
我编写了一个简单的备份脚本,它将文件夹(及其所有子文件夹)中的所有文件放在一个 TAR 存档中...
(它是经典的 TAR 格式,不是 USTAR,因此文件名及其路径不能超过 99 个字符)
<?php
/***********************************************************
* 标题:基于 Classic-TAR 的备份脚本 v0.0.1-dev
**********************************************************/

Tar_by_Vladson {
var
$tar_file;
var
$fp;
function
Tar_by_Vladson($tar_file='backup.tar') {
$this->tar_file = $tar_file;
$this->fp = fopen($this->tar_file, "wb");
$tree = $this->build_tree();
$this->process_tree($tree);
fputs($this->fp, pack("a512", ""));
fclose($this->fp);
}
function
build_tree($dir='.'){
$handle = opendir($dir);
while(
false !== ($readdir = readdir($handle))){
if(
$readdir != '.' && $readdir != '..'){
$path = $dir.'/'.$readdir;
if (
is_file($path)) {
$output[] = substr($path, 2, strlen($path));
} elseif (
is_dir($path)) {
$output[] = substr($path, 2, strlen($path)).'/';
$output = array_merge($output, $this->build_tree($path));
}
}
}
closedir($handle);
return
$output;
}
function
process_tree($tree) {
foreach(
$tree as $pathfile ) {
if (
substr($pathfile, -1, 1) == '/') {
fputs($this->fp, $this->build_header($pathfile));
} elseif (
$pathfile != $this->tar_file) {
$filesize = filesize($pathfile);
$block_len = 512*ceil($filesize/512)-$filesize;
fputs($this->fp, $this->build_header($pathfile));
fputs($this->fp, file_get_contents($pathfile));
fputs($this->fp, pack("a".$block_len, ""));
}
}
return
true;
}
function
build_header($pathfile) {
if (
strlen($pathfile) > 99 ) die('Error');
$info = stat($pathfile);
if (
is_dir($pathfile) ) $info[7] = 0;
$header = pack("a100a8a8a8a12A12a8a1a100a255",
$pathfile,
sprintf("%6s ", decoct($info[2])),
sprintf("%6s ", decoct($info[4])),
sprintf("%6s ", decoct($info[5])),
sprintf("%11s ",decoct($info[7])),
sprintf("%11s", decoct($info[9])),
sprintf("%8s", " "),
(
is_dir($pathfile) ? "5" : "0"),
"",
""
);
clearstatcache();
$checksum = 0;
for (
$i=0; $i<512; $i++) {
$checksum += ord(substr($header,$i,1));
}
$checksum_data = pack(
"a8", sprintf("%6s ", decoct($checksum))
);
for (
$i=0, $j=148; $i<7; $i++, $j++)
$header[$j] = $checksum_data[$i];
return
$header;
}
}

header('Content-type: text/plain');
$start_time = array_sum(explode(chr(32), microtime()));
$tar = & new Tar_by_Vladson();
$finish_time = array_sum(explode(chr(32), microtime()));
printf("所用时间:%f 秒", ($finish_time - $start_time));
?>
-1
Nicolas Merlet - admin(at)merletn.org
18 年前
如果您仍在使用 PHP4,这里有一个与 *scandir* 非常相似的函数...

此递归函数将返回一个索引数组,其中包含所有目录或文件或两者(取决于参数)。您可以指定所需的深度,如下所示。

<?php

// $path : 要浏览的路径
// $maxdepth : 浏览深度 (-1=无限深)
// $mode : "FULL"|"DIRS"|"FILES"
// $d : 必须未定义

function searchdir ( $path , $maxdepth = -1 , $mode = "FULL" , $d = 0 )
{
if (
substr ( $path , strlen ( $path ) - 1 ) != '/' ) { $path .= '/' ; }
$dirlist = array () ;
if (
$mode != "FILES" ) { $dirlist[] = $path ; }
if (
$handle = opendir ( $path ) )
{
while (
false !== ( $file = readdir ( $handle ) ) )
{
if (
$file != '.' && $file != '..' )
{
$file = $path . $file ;
if ( !
is_dir ( $file ) ) { if ( $mode != "DIRS" ) { $dirlist[] = $file ; } }
elseif (
$d >=0 && ($d < $maxdepth || $maxdepth < 0) )
{
$result = searchdir ( $file . '/' , $maxdepth , $mode , $d + 1 ) ;
$dirlist = array_merge ( $dirlist , $result ) ;
}
}
}
closedir ( $handle ) ;
}
if (
$d == 0 ) { natcasesort ( $dirlist ) ; }
return (
$dirlist ) ;
}

?>
-6
msh at onliners dot dk
18 年前
我想展示这两个简单的函数,用于生成完整的目录列表,因为我觉得其他示例在使用方面过于限制。

function dirTree($dir) {
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if($entry != '.' && $entry != '..' && is_dir($dir.$entry))
$arDir[$entry] = dirTree($dir.$entry.'/');
}
$d->close();
return $arDir;
}

function printTree($array, $level=0) {
foreach($array as $key => $value) {
echo "<div class='dir' style='width: ".($level*20)."px;'>&nbsp;</div>".$key."<br/>\n";
if(is_array($value))
printTree($value, $level+1);
}
}

用法很简单,如下
$dir = "<您喜欢的任何目录>";
$arDirTree = dirTree($dir);
printTree($arDirTree);

也很容易将文件添加到树中,所以尽情享受吧。
-5
engin bzzzt biz
18 年前
要以跨平台的方式连接目录和文件名,可以使用以下函数。

function join_path()
{
$num_args = func_num_args();
$args = func_get_args();
$path = $args[0];

if( $num_args > 1 )
{
for ($i = 1; $i < $num_args; $i++)
{
$path .= DIRECTORY_SEPARATOR.$args[$i];
}
}

return $path;
}

它应该执行以下操作
$src = join_path( '/foo', 'bar', 'john.jpg' );
echo $src; // 在 *nix 上 -> /foo/bar/john.jpg

$src = join_path( 'C:\www', 'domain.com', 'foo.jpg' );
echo $src; // 在 win32 上 -> C:\\www\\domain.com\\foo.jpg
-6
adrian
16 年前
在 Windows 环境下挂载的 Samba 无法使用挂载的驱动器盘符访问。例如,如果您在 Windows 中将驱动器 X: 挂载到 //example.local/shared_dir(其中 example.local 是运行 Samba 的 *nix 机器),则以下构造

$dir = "X:\\data\\";
$handle = opendir( $dir );

$d = dir( $dir );

将返回警告消息“无法打开目录:无错误”

另一方面,使用底层映射信息可以正常工作。例如

$dir = "//example.local/shared_dir/data";
$handle = opendir( $dir );

$d = dir( $dir );

两种情况都按预期工作。
-6
Jean-Paul Wattiaux
16 年前
只要 samba 卷实际挂载,我的方法就有效。在“我的电脑”窗口中列出它并不能保证它已挂载。
-18
phdwight at yahoo dot com
17 年前
我在 scandir 中发布了相同的观察结果,并发现它不仅仅限于 scandir,而是适用于所有目录函数。

目录函数目前不支持日语字符。
To Top