PHP遍历指定目录,并存储目录内所有文件属性信息


项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历。输出文件的属性信息,并存储。
想想需求,不就是一个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遍历指定目录,并存储目录内所有文件属性信息的更多相关文章
- 【Lua】关于遍历指定路径下所有目录及文件
关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...
- C#遍历指定路径下的目录
通过指定路径訪问路径下的文件.在C#的开发中主要利用了Directory类和DirectoryInfo类,简要介绍Directory类中的成员:命名空间 System.IO 命名空间 1.Create ...
- OpenCV代码提取:遍历指定目录下指定文件的实现
前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...
- [WinAPI] API 13 [遍历指定目录 打印文件和其他属性]
Windows API中,有一组专门的函数和结构,用于遍历目录,它们是FindFirstFile函数.FindNextFile函数和WIN32_FIND_DATA结构.使用FindFirstFile和 ...
- java-IO流(File对象-深度遍历指定目录下的文件夹和文件)
需求:遍历这个树状结构 File(String pathname) '\\'为了转义'\' // 通过抽象路径pathname 创建一个新的文件或者目录 File parent = new File( ...
- delphi遍历指定目录下指定类型文件的函数
遍历指定目录下指定类型文件的函数// ================================================================// 遍历某个文件夹下某种文件,/ ...
- Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
private void SMT(HttpContext context) { string SqlConnection82 = System.Configuration.ConfigurationM ...
- Android 4.0以后正确的获取外部sd卡存储目录
刚解决这个棘手的问题 找了很久,随笔记下. 网上搜索 android 获取外部sd卡存储目录 普遍都是: 1) Environment.getExternalStorageDirectory() 这个 ...
- Ubuntu上更改MySQL数据库数据存储目录
之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...
随机推荐
- BZOJ1901 Zju2112 Dynamic Rankings 主席树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...
- L3-020 至多删三个字符 (30 分) 线性dp
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 1] 内的字符串. 输 ...
- SqlServer 添加用户 添加角色 分配权限
转载自:https://www.cnblogs.com/accumulater/p/6158387.html --创建一个简单的登录,登录名为:newlogin:登录密码:123456:默认数据库 ...
- 如何在VS Code中进行golang编程
在VS Code中编程 使用Visual Studio Code的Go扩展,您可以获得诸如IntelliSense,代码导航,符号搜索,括号匹配,片段等语言功能,这些功能将帮助您进行Golang开发. ...
- P2326 AKN’s PPAP
P2326 AKN’s PPAP比较裸的贪心从高位向下枚举,如果当前位为1的个数大于1,ans+=(1<<i),然后从这些数中再向下枚举. #include<iostream> ...
- IntelliJ IDEA(九) :插件(转)
最近项目比较忙,很久没有更新IDEA系列了,今天介绍一下IDEA的一些炫酷的插件,IDEA强大的插件库,不仅能给我们带来一些开发的便捷,还能体现我们的与众不同. 0|11.插件的安装 打开settin ...
- tensorflow 使用CPU而不使用GPU的问题解决
今天发现一个怪现象,在训练keras时,发现不使用GPU进行计算,而是采用CPU进行计算,导致计算速度很慢. 用如下代码可检测tensorflow的能使用设备情况: from tensorflow.p ...
- SqlDataAdapter更新数据
插入.更新和删除的排序 在许多情况下,以何种顺序向数据源发送通过 DataSet 作出的更改是相当重要的. 例如,如果已更新现有行的主键值并且添加了具有新主键值的新行, 则务必要在处理插入之前处理更新 ...
- 细解javascript中的this关键字
JavaScript函数中的this指向并不是在函数定义的时候确定的,而是在调用的时候确定的.换句话说,函数的调用方式决定了this指向. 一. 全局上下文 在函数外部,无论是否在严格模式下,this ...
- Logging模块 + traceback模块 + importlib模块 + requests模块
Logiging模块日志级别 CRITICAL = 50FATAL = CRITICALERROR = 40WARNING = 30WARN = WARNINGINFO = 20DEBUG = 10N ...