php 递归读取文件夹内所有文件报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 递归读取文件夹内所有文件报错相关的知识,希望对你有一定的参考价值。

Fatal error:Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes)

代码:
$MyArry=array();
$files=array();
$num=0;
function GetAllFileByDir($fileDir)

global $num;
$MyArry=scandir($fileDir);
for($j=0;$j<count($MyArry);$j++)

if(is_dir($MyArry[$j]))

GetAllFileByDir($MyArry[$j]);

else

$files[$num]=$MyArry[$j];
$num++;



GetAllFileByDir("G:/上传数据");
if(count($files)>0)

for($s=0;$s<count($files);$s++)

echo $files[$s]."<br/>";


不要说加内存...求大神解答

你没有去除目录下的"."和“..”的情况,还有就是你is_dir里那个参数判断有问题,你参数路径不完整,然后就是你的$file没有全局。

"."是上一级目录,".."是当前目录,循环到这两个的时候就陷入死循环了,你有再大的空间也不够。

修改后的方法是:

function GetAllFileByDir($fileDir)

 global $num,$files;
 $MyArry=scandir($fileDir);
 for($j=0;$j<count($MyArry);$j++)
 
  if($MyArry[$j]!="."&&$MyArry[$j]!=".."&&is_dir($fileDir."/".$MyArry[$j]))
  
   GetAllFileByDir($fileDir."/".$MyArry[$j]);
  
  elseif($MyArry[$j]!="."&&$MyArry[$j]!="..")
  
   $files[$num]=$MyArry[$j];
   $num++;
  
 

GetAllFileByDir("d:/test");
if(count($files)>0)

 for($s=0;$s<count($files);$s++)
 
  echo $files[$s]."<br/>";
 

参考技术A 可能原因:
1.浏览的文件数目太多,导致内存不足,用ini_set提高内存
2.scandir可能会返回 . 或 .. 类型的地址,请不要再循环这种地址,scandir中的路径请使用绝对路径,我看你代码中没有排除. 和 .. 的文件夹,否则会出现死循环追问

“G:/上传数据”文件夹内一共25个文件,且都为绝对路径,也不存在..的文件夹,代码是之前C#的,运行正常,拷贝过来改了一下,求解释...

追答

你的代码很明显没有过滤掉.. 和 .,php代码不同的,我常用的写法
/**
目录操作
@param string $folder 存在的目录名称
@param $callback 在遍历时使用的函数
@return array文件结构树
*/
function scanFolderArray($folder,$callback='')

if(!file_exists($folder))
return false;


if(is_dir($folder))

$sub = scandir($folder);
$temp = array();
foreach($sub as $k=>$fname)

if($fname!='.' && $fname!='..')
$fullName = $folder.'./'.$fname;
if(is_dir($fullName))
$temp[$fname] = scanFolderArray($fullName);
else
$temp[] = $fname;


if(function_exists($callback))
$callback($fullName);




return $temp;

Java递归读取文件路径下所有文件名称并保存为Txt文档

本文用递归的方法实现读取一个路径下面的所有文件并将文件名称保存到Txt文件中,亲测可用。

递归读取文件路径下的所有文件:

/**
     * 递归读取文件路径下的所有文件
     * 
     * @param path
     * @param fileNameList
     * @return
     */
    public static ArrayList<String> readFiles1(String path, ArrayList<String> fileNameList) {
        File file = new File(path);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    readFiles1(files[i].getPath(), fileNameList);
                } else {
                    String path1 = files[i].getPath();
                    String fileName = path1.substring(path1.lastIndexOf("\") + 1);
                    fileNameList.add(fileName);
                }
            }
        } else {
            String path1 = file.getPath();
            String fileName = path1.substring(path1.lastIndexOf("\") + 1);
            fileNameList.add(fileName);
        }
        return fileNameList;
    }

将内容输出到(追加)txt文件保存:

/**
     * 将内容输出到(追加)txt文件保存
     * 
     * @param content
     * @throws IOException
     */
    public static void outputToTxt(String content, String outputPath) throws IOException {
        FileWriter fw = null;
        PrintWriter pw = null;
        fw = new FileWriter(outputPath, true);//追加内容
        pw = new PrintWriter(fw);
        pw.println(content + "
");
        pw.close();
        fw.close();
        pw.flush();
    }

测试:

进行测试,读取“E:图书图书馆小说杂文”下的所有文件,并将结果输出到
“C:UsersAdministratorDesktopfileNameList.txt”中。测试代码如下:

public static void main(String[] args) {
        String filePath = "E:\图书\图书馆\小说杂文";
        String outputPath1 = "C:\Users\Administrator\Desktop\fileNameList.txt";
        try {
            ArrayList<String> fileNameList = readFiles1(filePath, new ArrayList<String>());
            System.out.println(fileNameList.size());
            for (int i = 0; i < fileNameList.size(); i++) {
                outputToTxt(fileNameList.get(i), outputPath1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

测试结果如下:

这是文件路径,路径下面有一个新建文件夹和若干个txt文件,共1086个对象,新建文件夹下面共有10个txt文件,计算可得此路径下面共有1086+10-1=1095个txt个文件:
技术分享图片
技术分享图片
这是运行的控制台打印信息,共有1095条打印信息:
技术分享图片
这是桌面的fileNameList.txt,一共有1095行:
技术分享图片








以上是关于php 递归读取文件夹内所有文件报错的主要内容,如果未能解决你的问题,请参考以下文章

如何用递归获取一个文件夹内的所有文件存放在一个文件数组中

php 遍历文件夹文件问题

php遍历输出文件夹内包含指定关键字图片

如何用递归获取一个文件夹内的所有文件存放在一个文件数组中?

在php中, 如何动态读取目录文件夹下的图片?

php遍历文件夹是先文件夹还是文件