项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历。输出文件的属性信息,并存储。

想想需求,不就是一个ls -al命令吗,实现获取相关属性就好了,再加上一个遍历OK了事。

项目过程中,便于操作,使用了json格式存储,但是也发现了一些问题。谨此记录问题及代码,便于参考。

<?php
define('INDEXFORMAT',"dir,name,size,perms,ower,group,ctime,mtime,atime,suffix") ;
define('INDEXTXT', 'data/index.txt');
define('INDEXJSON', 'data/index.json');
date_default_timezone_set('Asia/Hong_Kong'); if (file_exists(INDEXTXT)) {
unlink(INDEXTXT);
}
$dir = './';
getIndexFile($dir); /*
* get index file
* @filename INDEXTXT
* @dir string
*
*/
function getIndexFile($dir,$whitelist=''){
$string = '';
$dir = trim($dir);
$dir = realpath($dir);
$dir = $dir."//";
if(is_file($dir)){
putIndexFile($dir);
}else{
putIndexFile($dir);
$oDir = @opendir($dir);
while($fileName = readdir($oDir)){
if($fileName!='.' && $fileName!='..'){
if(is_file($dir.$fileName)){
putIndexFile($dir.$fileName);
}elseif(is_dir($dir.$fileName)){
getIndexFile($dir.$fileName);
}
}
}
}
if (!file_exists(INDEXTXT)) {
return false;
}
//$data = json_encode(getIndexFromFile());
//file_put_contents(INDEXJSON,$data);
return true;
} /*
* Get Index file
* @filename file.index
*
*/
function putIndexFile($file){
if (!file_exists($file)) {
return false;
}
$format = explode(',', INDEXFORMAT);
$string = "";
foreach ($format as $key => $value) {
if($key !== 0 ){
$string .= "\t";
}
$string .= getFileAttr($file,$value);
}
$string .= "\n";
file_put_contents(INDEXTXT, $string, FILE_APPEND);
} /*
*
* Get index string from index file
* @return Array()
*
*/
function getIndexFromFile($flag=''){
if (!file_exists(INDEXTXT)) {
return false;
}
$arr = file(INDEXTXT);
$format = explode(',', INDEXFORMAT);
$result = array();
if(!empty($flag)){
$key = array_search($flag, $format);
if ($key === false) {
return false;
}
foreach ($arr as $str) {
$tmp = explode(" ", trim($str));
$result[$flag][] = $tmp[$key];
}
}else{
foreach ($arr as $str) {
$tmp = explode(" ", trim($str));
foreach ($format as $key => $value) {
$result[$value][] = $tmp[$key];//经测试这个操作比较耗时,大概0.7s的样子,慎用!
}
}
}
return $result;
} /*
* get file attributes
* @var $file
* @var $flag
* @return String
*/ function getFileAttr($file,$flag){
if (!file_exists($file)) {
return false;
}
switch ($flag) {
case 'dir':
if(is_file($file))
return dirname($file);
return realpath($file);
break;
case 'name':
if(is_file($file))
return basename($file);
return '-';
break;
case 'size':
if(is_file($file))
return filesize($file);
return '-';
break;
case 'perms':
return substr(sprintf('%o', fileperms($file)), -4);;
break;
case 'ower':
return fileowner($file);
break;
case 'group':
return filegroup($file);
break;
case 'ctime':
return filectime($file);
break;
case 'mtime':
return filemtime($file);
break;
case 'atime':
return fileatime($file);
break;
case 'suffix':
if(is_file($file))
return substr($file, strrpos($file, '.')+1);
return '-';
break;
default:
return false;
break;
}
} /*
* get file size human readable
*/
function getFileSizeFormat($file){
if(!is_file($file)){
return '-';
}
$flags = array('', 'K', 'M', 'G', 'T');
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
return round($size, 2).$flags[$i];
}

PHP遍历指定目录,并存储目录内所有文件属性信息的更多相关文章

  1. 【Lua】关于遍历指定路径下所有目录及文件

    关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...

  2. C#遍历指定路径下的目录

    通过指定路径訪问路径下的文件.在C#的开发中主要利用了Directory类和DirectoryInfo类,简要介绍Directory类中的成员:命名空间 System.IO 命名空间 1.Create ...

  3. OpenCV代码提取:遍历指定目录下指定文件的实现

    前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...

  4. [WinAPI] API 13 [遍历指定目录 打印文件和其他属性]

    Windows API中,有一组专门的函数和结构,用于遍历目录,它们是FindFirstFile函数.FindNextFile函数和WIN32_FIND_DATA结构.使用FindFirstFile和 ...

  5. java-IO流(File对象-深度遍历指定目录下的文件夹和文件)

    需求:遍历这个树状结构 File(String pathname) '\\'为了转义'\' // 通过抽象路径pathname 创建一个新的文件或者目录 File parent = new File( ...

  6. delphi遍历指定目录下指定类型文件的函数

    遍历指定目录下指定类型文件的函数// ================================================================// 遍历某个文件夹下某种文件,/ ...

  7. Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)

    private void SMT(HttpContext context) { string SqlConnection82 = System.Configuration.ConfigurationM ...

  8. Android 4.0以后正确的获取外部sd卡存储目录

    刚解决这个棘手的问题 找了很久,随笔记下. 网上搜索 android 获取外部sd卡存储目录 普遍都是: 1) Environment.getExternalStorageDirectory() 这个 ...

  9. Ubuntu上更改MySQL数据库数据存储目录

    之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...

随机推荐

  1. Linux && 与 ||

    一.&& && 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2' || 表示上一条命令执行失败后,才执行下一条 ...

  2. POJ1456 Supermarket 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1456 题意概括  一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该 ...

  3. 【Java】 剑指offer(59-1) 滑动窗口的最大值

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...

  4. maven环境的配置,如果jar包下载不下来,其他配置无错误的话,极有可能是网速的缘故

    1首先下载apach maven 2配置maven环境变量 m2_home  maven的源文件的路径 path变量后跟 %m2_home%\bin 3cmd 控制台运行mvn -version 查看 ...

  5. QT学习之菜单栏与工具栏

    QT学习之菜单栏与工具栏 目录 简单菜单栏 多级菜单栏 上下菜单栏 工具栏 简单菜单栏 程序示例 from PyQt5.QtWidgets import QApplication, QMainWind ...

  6. VB.NET只允许打开一个实例

    If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) ...

  7. php页面静态化,ob缓存方法

    <?php ob_start();//开启缓存 //要生成静态网页的内容开始 ?> 中间的html代码 <?php //要生成静态网页的内容结束 //把生成的静态内容保存到文件,而不 ...

  8. CF1039C.Network Safety

    目录 题目链接 题解 代码 题目链接 CF1039C.Network Safety 题解 对于一对相邻点,^异或后相同的值唯一a_i ^ t= b_i,a_i ^ b_i = t 对于不在t集合的直接 ...

  9. Python3自然语言(NLTK)——语言大数据

    NLTK 这是一个处理文本的python库,我们知道文字性的知识可是拥有非常庞大的数据量,故而这属于大数据系列. 本文只是浅尝辄止,目前本人并未涉及这块知识,只是偶尔好奇,才写本文. 从NLTK中的b ...

  10. nginx 负载均衡集群解决方案 healthcheck_nginx_upstreams模块测试 (二)

    在这里详细讲解healthcheck_nginx_upstreams模块中存在的bug,对于healthcheck_nginx_upstreams模块的安装和使用请阅读上一篇blog进行学习. 测试环 ...