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数据库数据存储目录时遇到了之前未遇到的问题,之 ...
随机推荐
- centos7网卡名修改
centos7网卡名不是以etho的方式命名,有时候在自动化方面不便于管理,在安装的时候输入如下代码即可命名: net.ifnames=0 biosdevname=0
- SQL存储过程使用参考代码
存储过程 use EBuy go --常用的系统存储过程 sp_addmessage --将新的用户定义错误消息存储在SQL Server数据库实例中 sp_helptext --显示用 ...
- Codeforces 659G Fence Divercity dp
Fence Divercity 我们设a[ i ] 为第 i 个围栏被切的最靠下的位置, 我们发现a[ i ] 的最大取值有一下信息: 如果从i - 1过来并在 i 结束a[ i ] = min(h ...
- Codeforces 643C Levels and Regions 斜率优化dp
Levels and Regions 把dp方程列出来, 把所有东西拆成前缀的形式, 就能看出可以斜率优化啦. #include<bits/stdc++.h> #define LL lon ...
- 018 spark on yarn (Job history)的配置,主要是yarn处跳转到历史聚合页面
一:目标 1.目标 在yarn的8080页面可以跳转到spark的日志18080页面. 因为在运行spark之后,看对应的job的日志,这样直接连接,更合理直接. 2.总结 在后面可以看到,其实不需要 ...
- CentOS root用户修改密码
1.root用户修改密码: #passwd -------------------------------- 参考资料: 1.Centos修改root密码:http://blog.163.com/wz ...
- UVA 129困难的串【DFS】
题目链接 题目大意: 给出n,l:要求按特定格式输出由前l个大写字母构成的按字母表排列的第n个没有连续重复子串的字符串以及该字符串长度. 此题是一道dfs递归回溯的基础题,难点在于对当前字符串是否有连 ...
- python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)
python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_usera ...
- 8,EasyNetQ-多态发布和订阅
您可以订阅一个接口,然后发布该接口的实现. 我们来看一个例子. 我有一个接口IAnimal和两个实现猫和狗: public interface IAnimal { string Name { get; ...
- Flask的使用2
1.Flask文件的配置 # 方式一: # 直接书写 app.config['SESSION_COOKIE_NAME'] = 'session_lvning' # 方式二: #引入setting.py ...