遍历文件夹下的特定文件,所有人都推荐使用 _findfirst 还有 _findnext来进行操作,不是很难,但是我的项目必须要在64位环境下编译,x64环境下编译的话, _findfirst 还有 _findnext 则不能使用,会报错。
在微软的网站上看到这样一些定义,觉得解决有望:
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
__int64 _findfirsti64( char *filespec, struct _finddata_t *fileinfo );
以为改一下函数名字就ok,谁知道fileinfo又会报错,开始的时候这部分我是无法理解的,形参都一样的,不应该报错,后来我又继续查找资料,得到了这些:
int _findnext32(
intptr_t handle,
struct _finddata32_t *fileinfo
);
int _findnext64(
intptr_t handle,
struct __finddata64_t *fileinfo
);
啊啊,原来是fileinfo的类型也有所变化,同时相关的文件的句柄的类型也要有所变化,和64位相匹配,
我用的_int64 Handle;来申请的。
下面我复制我的一段代码,重点看一下其中 Handle、FileInfo两个变量的类型,还有_findfirst64、_findnext64两个函数的不同,其他部分与网上通用的,不区分32位和64位的函数一样使用:
//这段代码是VS2013环境下使用C++编程
//打印出目录下的所有后缀为jpg的文件名字,并统计图片数量
#include<io.h>
#include<stdio.h>
int main()
{
__int64 Handle;
long jpg_num=0;
struct __finddata64_t FileInfo;
if ((Handle = _findfirst64("D:\\picture\\*.jpg", &FileInfo)) == -1L)
printf("没有找到匹配的项目\n");
else
{
printf("%s\n", FileInfo.name);
while (_findnext64(Handle, &FileInfo) == 0){
jpg_num++;
printf("%s\n", FileInfo.name);
}
_findclose(Handle);
}
printf("%d\n", jpg_num);
getchar();
return 0;
}
后记
看完这些,希望你已经没有想看更深层头文件的源码的冲动了。
如果是这样的话,不妨点个赞吧。
为何要点赞?
如果本文解决了你的困惑,不妨点个赞鼓励一下。
不管你信不信,也不管你同不同意,实际上,你的每一次点赞都标志着你自身的进步。而打赏乃是点赞的高级形式
曾经有无数个点赞的机会,但是我都没有好好珍惜,假如时光可以倒流,我一定为他们也为自己点赞。