项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历。输出文件的属性信息,并存储。
想想需求,不就是一个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]; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍C#遍历指定目录下所有文件的方法,包括了C#遍历指定目录下所有文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#遍历指定目录下所有文件的方法。分享给大家供大家参考。具体分析如下: 先通过DirectoryInfo打开指定的目录,然后通过GetFiles()方法读取文件夹下的所有文件 希望本文所述对大家的C#程序设计有所帮助。
问题内容: 我正在寻找一个循环遍历目录中所有文件的PHP脚本,以便可以使用文件名进行操作,例如格式,打印或将其添加到链接中。我希望能够按名称,类型或创建/添加/修改的日期对文件进行排序。(想想目录“ index”。)我还希望能够将排除项添加到文件列表中,例如脚本本身或其他“系统”文件。(类似于和“目录”。) 由于我希望能够修改脚本,因此我对查看PHP文档和学习如何自己编写更感兴趣。就是说,如果有任
本文向大家介绍python 遍历目录(包括子目录)下所有文件的实例,包括了python 遍历目录(包括子目录)下所有文件的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇python 遍历目录(包括子目录)下所有文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
本文向大家介绍PHP删除指定目录中的所有目录及文件的方法,包括了PHP删除指定目录中的所有目录及文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP删除指定目录中的所有目录及文件的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。
问题内容: 我需要创建一个遍历子目录中所有文件的循环。您能帮我构造我的代码吗? 问题答案: 将RecursiveDirectoryIterator与RecursiveIteratorIterator结合使用。
本文向大家介绍PHP遍历目录并返回统计目录大小,包括了PHP遍历目录并返回统计目录大小的使用技巧和注意事项,需要的朋友参考一下