没看到能打的,遍历目录并读取目录下的文件列表。(C语言,SDK)
遍历目录并读取目录下的所有文件,这个功能经常用,也简单,很多年前就看过网上的代码,感觉写复杂了,而且还浪费栈,发文的人说会“爆栈”(而且还不是一个人)。当时看到那些代码就觉得写的不好,不过觉得无关痛痒没有发博文。
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)相关推荐
- 关于BaiduPCS-Go不能用问题解决,报错【获取目录下的文件列表 遇到错误, 远端服务器返回错误】
BaiduPCS-Go不能使用报错:获取目录下的文件列表 遇到错误, 远端服务器返回错误, 代码: 4, 消息: No permissionto do this operation, 路 ...
- 修改linux ftp共享目录权限,linux系统下修改文件夹目录权限
文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何修改Linux文件-文件夹权限.以主 ...
- python获取文件夹下文件_Python 获取目录下的文件列表与内容
下面的python例子是列举用户目录下面的文件 import os import sys #info=os.getcwd() #listfile=os.listdir(os.getcwd()) inf ...
- python读取dat数据_dat文件读写_c语言读写dat文件_c语言读dat文件 - 云+社区 - 腾讯云...
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 13 }文件读写:写入目录的获取比较麻烦,各个平台不同,所以用c++自己的文件读 ...
- Java 读取resources下的文件
读取resources下的资源文件 文件如图: 工具包 <!-- commons-io io的工具包 --> <dependency><groupId>common ...
- Python 获取目录下的文件列表,并自然排序
在实际的算法与程序开发中,经常需要面对的场景就是对同一目录内的文件进行批量操作.并且很多时候目录中的文件明明是有规律的,同时希望程序在进行处理时也是按照一定的顺序进行. 方法 1 >>&g ...
- idea 文件流读取web-inf下的文件_C#初学者教程系列20:Stream流读写
本文是C#初学者简单教程,这是第20篇.感谢观看,记得关注我,后续还有更多教程文章,谢谢. 本文环境为Visual Studio 2019. 一.介绍 在C#文件操作中,通常使用流来读取和写入文件.流 ...
- C/C++ 获取目录下的文件列表信息
在C/C++编程时,需要获取目录下面的文件列表信息. 1.数据结构 struct dirent { long d_ino; /* inode number 索引节点号 ...
- php获取指定目录下所有文件列表,PHP 获取指定目录下所有文件(包含子目录)...
set DestPath=.for /f "delims=" %%i in ('dir /ad /b ' ) do (copy %DestPath%\%%i\*.txt %Dest ...
- springboot读取resource下json文件出现空指针异常
1.pom包依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</ ...
最新文章
- 利用Gephi软件绘制网络图
- 《Nature》纪念人工智能60周年专题:深度学习综述
- C语言文件操作解析(二)
- 开源Easydarwin流媒体服务器Windows编译、配置、部署
- InsertSort -- 插入排序
- Unity中Debug打印信息的颜色设置
- ffmpeg常用数据结构4
- 炼丹手册——学习率设置
- C# HashSet 实例
- C语言约瑟夫环(简单版)
- JAVA后端开发常用的Linux命令总结
- 关于Arduino下载并添加DHT11库文件的详细教程
- Java输入小数和整数求COSx_嗖嗖移动大厅 源代码 Java初级小项目
- android视频的编辑(录制,裁剪,合成)(1)
- 2021 Android APK反编译 apktool使用教程
- Cheat Engine安装 汉化
- 进阶项目(6)LCD12864液晶屏幕设计讲解
- vmvare workstation 15Pro密钥
- mysql查找附近算法_Java+MySQL实现附近功能
- 个性签名代码(花了1个多小时从网上搜集以及整理)