遍历目录并读取目录下的所有文件,这个功能经常用,也简单,很多年前就看过网上的代码,感觉写复杂了,而且还浪费栈,发文的人说会“爆栈”(而且还不是一个人)。当时看到那些代码就觉得写的不好,不过觉得无关痛痒没有发博文。

N年过去,遇到类似的情况,有点忍不住,这么简单的东西。今天专门去搜索了网上(摆渡和谷歌上面的代码,包括StackOverflow上面的代码,不禁说出周星星电影《破坏之王》里面断水流大师兄的那段话。
找到的代码,几乎都是类似的,代码长,真浪费内存,速度又慢,还没有错误判断。
找一个稍好的例子。
bool ListDirectoryContents(const wchar_t *sDir)

    WIN32_FIND_DATA fdFile; 
    HANDLE hFind = NULL;

wchar_t sPath[2048];

//Specify a file mask. *.* = We want everything! 
    wsprintf(sPath, L"%s\\*.*", sDir);

if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE) 
    { 
        wprintf(L"Path not found: [%s]\n", sDir); 
        return false; 
    }

do
    { 
        //Find first file will always return "."
        //    and ".." as the first two directories. 
        if(wcscmp(fdFile.cFileName, L".") != 0
                && wcscmp(fdFile.cFileName, L"..") != 0) 
        { 
            //Build up our file path using the passed in 
            //  [sDir] and the file/foldername we just found: 
            wsprintf(sPath, L"%s\\%s", sDir, fdFile.cFileName);

//Is the entity a File or Folder? 
            if(fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY) 
            { 
                wprintf(L"Directory: %s\n", sPath); 
                ListDirectoryContents(sPath); //Recursion, I love it! 
            } 
            else{ 
                wprintf(L"File: %s\n", sPath); 
            } 
        }
    } 
    while(FindNextFile(hFind, &fdFile)); //Find the next file.

FindClose(hFind); //Always, Always, clean things up!

return true;

}

网上的都是类似的,还有说遍历复杂云云,其实不复杂,代码短并且省内存(这里主要是省栈),速度更快。

这样写的时候,想想就发现,有两个地方可以优化,第一,局部变量sPath,这里占用内存大,而且还每次都复制一次,速度慢;第二、局部变量fdFile,这个占用内存也大......
又大又慢,所以会爆栈。

我现在记事本写一个比这个好的(N年前就这么写了,还有牛人说不需要递归,当时想了一下,我也实现了)。
UINT ListFiles(const TCHAR *pathname, UINT pathnamelength, UINT pathnamesize, WIN32_FIND_DATA *pfd)
{

HANDLE hfind;

UINT l;

UINT result = 0;

if (pathnamelength > 0 && pathname[pathnamelength - 1] != _T('\\'))

{
pathname[pathnamelength++] = _T('\\');

}

pathname[pathnamelength+0] = _T('*');

pathname[pathnamelength+1] = _T('.');

pathname[pathnamelength+2] = _T('*');

pathname[pathnamelength+3] = _T('\0');

hfind = FindFirstFile(pathname, pfd);
if(hfind != INVALID_HANDLE_VALUE) 
{
    do
    { 
        // 这里可以优化的,留给有追求的人优化,不过这里不是关键
        if(_tcscmp(pfd->cFileName, _T(".")) != 0 && _tcscmp(pfd->cFileName, _T("..")) != 0)

{

l = _tcslen(pfd->cFileName);

// 避免越界

if (pathnamelength + l < pathnamesize)

{

// 重用了占用内存的pathname和pfd

_tcscpy(pathname + pathnamelength, pfd->cFileName);

// 已经获取了文件信息,爱干嘛干嘛去

if(pfd->dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)


                            result += ListFiles(pathname, pathnamelength + l, pathnamesize, pfd);
                    } 
                    else{ 
                    result++;

}

}

}
    } while(FindNextFile(hfind, pfd));

FindClose(hfind);

}

return (result);

}

我在网上看到linux下遍历的代码也大同小异,也没有优化,都可以类似这么写的。

不骄傲,一个小代码而已,N年前就会这么写了。

没看到能打的,遍历目录并读取目录下的文件列表。(C语言,SDK)相关推荐

  1. 关于BaiduPCS-Go不能用问题解决,报错【获取目录下的文件列表 遇到错误, 远端服务器返回错误】

           BaiduPCS-Go不能使用报错:获取目录下的文件列表 遇到错误, 远端服务器返回错误, 代码: 4, 消息: No permissionto do this operation, 路 ...

  2. 修改linux ftp共享目录权限,linux系统下修改文件夹目录权限

    文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何修改Linux文件-文件夹权限.以主 ...

  3. python获取文件夹下文件_Python 获取目录下的文件列表与内容

    下面的python例子是列举用户目录下面的文件 import os import sys #info=os.getcwd() #listfile=os.listdir(os.getcwd()) inf ...

  4. python读取dat数据_dat文件读写_c语言读写dat文件_c语言读dat文件 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 13 }文件读写:写入目录的获取比较麻烦,各个平台不同,所以用c++自己的文件读 ...

  5. Java 读取resources下的文件

    读取resources下的资源文件 文件如图: 工具包 <!-- commons-io io的工具包 --> <dependency><groupId>common ...

  6. Python 获取目录下的文件列表,并自然排序

    在实际的算法与程序开发中,经常需要面对的场景就是对同一目录内的文件进行批量操作.并且很多时候目录中的文件明明是有规律的,同时希望程序在进行处理时也是按照一定的顺序进行. 方法 1 >>&g ...

  7. idea 文件流读取web-inf下的文件_C#初学者教程系列20:Stream流读写

    本文是C#初学者简单教程,这是第20篇.感谢观看,记得关注我,后续还有更多教程文章,谢谢. 本文环境为Visual Studio 2019. 一.介绍 在C#文件操作中,通常使用流来读取和写入文件.流 ...

  8. C/C++ 获取目录下的文件列表信息

    在C/C++编程时,需要获取目录下面的文件列表信息. 1.数据结构 struct dirent { long d_ino;                 /* inode number 索引节点号 ...

  9. php获取指定目录下所有文件列表,PHP 获取指定目录下所有文件(包含子目录)...

    set DestPath=.for /f "delims=" %%i in ('dir /ad /b ' ) do (copy %DestPath%\%%i\*.txt %Dest ...

  10. springboot读取resource下json文件出现空指针异常

    1.pom包依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</ ...

最新文章

  1. 利用Gephi软件绘制网络图
  2. 《Nature》纪念人工智能60周年专题:深度学习综述
  3. C语言文件操作解析(二)
  4. 开源Easydarwin流媒体服务器Windows编译、配置、部署
  5. InsertSort -- 插入排序
  6. Unity中Debug打印信息的颜色设置
  7. ffmpeg常用数据结构4
  8. 炼丹手册——学习率设置
  9. C# HashSet 实例
  10. C语言约瑟夫环(简单版)
  11. JAVA后端开发常用的Linux命令总结
  12. 关于Arduino下载并添加DHT11库文件的详细教程
  13. Java输入小数和整数求COSx_嗖嗖移动大厅 源代码 Java初级小项目
  14. android视频的编辑(录制,裁剪,合成)(1)
  15. 2021 Android APK反编译 apktool使用教程
  16. Cheat Engine安装 汉化
  17. 进阶项目(6)LCD12864液晶屏幕设计讲解
  18. vmvare workstation 15Pro密钥
  19. mysql查找附近算法_Java+MySQL实现附近功能
  20. 个性签名代码(花了1个多小时从网上搜集以及整理)

热门文章

  1. DRAM存储系统结构
  2. 如何注册电子邮箱账号,教你创建email邮箱账号
  3. H2---主题:融入动画技术的交互应用
  4. python自行实现支付宝证书签名验签全流程
  5. LeetCode-781-森林中的兔子
  6. 【信号与系统】拉普拉斯变换
  7. 找出java重复字符串,java 找出字符串出现重复的字符和次数
  8. 威金又现!专杀收集整合
  9. [估值-001] 净资产收益率和现值的关系
  10. 重庆大学计算机学院专硕分析,重庆大学电子信息(专硕)专业考研难度分析-专业排名-难度大小...