打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
bd-C++ 快速获取文件夹(目录)下的所有文件名(VS2013测试通过)
userphoto

2022.11.27 北京

关注

说起使用C++操作文件,最常见的是当属对单一文件进行读写了,但有时我们需要一个目录下的所有文件又该怎么快速获取呢?

这个问题的难点在于如何查找文件目录下的文件及其数量,以及如何递归查找目录下的子目录的文件及其数量。

我一下子就懵了,赶紧打开搜索引擎,在互联网上找了一圈,发现核心代码几乎都是同一段(原作者已不可考究):

#include <iostream>
#include <string>
#include <vector>
//注意这个头文件
#include <io.h>
using namespace std;

//核心函数
void getFileNames(string path, vector<string>& files);

int main(){
	vector<string> fileNames;
	string path("D:\\test"); 	//自己选择目录测试
	getFileNames(path, fileNames);
	for (const auto &ph : fileNames) {
		std::cout << ph << "\n";
	}
	return 0;
} 
//核心代码
void getFileNames(string path, vector<string>& files)
{
	//文件句柄
	//注意:我发现有些文章代码此处是long类型,实测运行中会报错访问异常
	intptr_t hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
	{
		do
		{
			//如果是目录,递归查找
			//如果不是,把文件绝对路径存入vector中
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
					getFileNames(p.assign(path).append("\\").append(fileinfo.name), files);
			}
			else
			{
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

笔者在Visual Studio 2017中测试结果如下:
输入路径:D:\\test(或者D:/test),文件分布为如图:

输出结果:


所以上述代码应该是正确无误的。


想必你也注意到了 #include <io.h> 这条语句,看起来不太像C/C++标准库(C++标准库一般没有.h,在C++使用C标准库一般是cxxx,例如cstdio),而且getFilesNames里面用了大量该文件中的。在VS中打开该文件,有一些简单的注释(不知所云):

// io.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// This file declares the low-level I/O and file handling functionality.

但是这里使用**#include <io.h>** 而不是**#include “io.h”** 说明 io.h 这个头文件在编译器的默认搜索路径,而不在当前项目路径。据查, 关于这个io.h的信息很少,但可以肯定的是它并不是标准C/C++语言的头文件,我用everythig搜索了该名字,发现在我电脑上以下路径: D:\Windows Kits\10\Include\10.0.17763.0\ucrt\io.h.

  • ucrt:就是Universal C Runtime 库,即,通用C运行时库,包含众多C的头文件。

  • ucrt目前已经成为Windows组之一,从Windows 10开始作为操作系统的一部分提供。对应的lib库为libucrt.lib,对应的dll库为ucrtbase.dll

所以 io.h 应该是个VC运行时(runtime)库,使用它可能在跨平台(unix/linux)上会有问题,谨慎使用。


目前也没找到更好的读取某一目录下的文件信息的方式,如果有知道的小伙伴可以在评论区赐教哦~


原创文章,欢迎转载,转载请注明本文链接:https://blog.csdn.net/Love_Point/article/details/109209154注意百度和各类采集站皆不可信,搜索时请谨慎甄别。同时由于文章一般都有时效性,本人可能会不定期对自己的博文进行修正和更新,因此敬请访问出处以查看最新版本。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++获取目录下的文件列表
C#操作目录和文件
C# 使用原生 System.IO.Compression 实现 zip 的压缩与解压
C#文件操作
C++下遍历文件夹
更有效的文件下载功能
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服