【C++】获取该路径下所有文件名
实现该程序需要用到几个对于我来说我太常用的结构体、类和方法,在论坛内摘抄了他们的一些讲解,并自己实现了一个查找文件并保存的小程序

_finddata_t 结构体

首先是io.h中的**_finddata_t** 结构体,这个结构体的作用是存储文件的各种信息,其定义如下:

struct _finddata_t{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;_fsize_t size;char name[_MAX_FNAME];};

unsigned atrrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在源文件中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为 1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。

time_t time_create:这里的time_t是一个变量类型,实际上就是长整形变量 long int,用来保存从1970年1月1日0时0分0秒到现在时刻的秒数

time_t time_access:文件最后一次被访问的时间。

time_t time_write:文件最后一次被修改的时间。

_fsize_t size:文件的大小(字节数表示)。

char name[_MAX_FNAME]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。

如何使用这个结构体才能够将文件的信息存储到该结构体的内存空间呢,这就需要_findfirst()、_findnext()和_fineclose()三个函数的搭配使用,下面介绍这三个函数:

long _findfirst( char *filespec, struct _finddata_t *fileinfo );

    返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄。这个句柄将会在_findnext函数中被使用。失败返回-1.参数:filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体所分配的内存空间中。

int _findnext( long handle, struct _finddata_t *fileinfo );

    返回值:若成功返回0,否则返回-1。参数:handle:即由_findfirst函数返回回来的句柄。fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。

int _findclose( long handle );

     返回值:成功返回0,失败返回-1。参数:handle :_findfirst函数返回回来的句柄。

该结构体和搭配的函数使用的逻辑就是先用_findfirst查找第一个文件,若成功则用返回的句柄,调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。

vector类

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。
vector arr;

建立一个vector,type为数组元素的数据类型,arr为动态数组名

简单的使用方法如下:

vectortest;//建立一个vector

test.push_back(1);

test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2

String类

1.声明一个C++字符串
声明一个字符串变量很简单:
string Str;
这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:
a) string s; //生成一个空字符串s
b) string s(str) //拷贝构造函数 生成str的复制品
c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值
d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
e) string s(cstr) //将C字符串作为s的初值
f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g) string s(num,c) //生成一个字符串,包含num个c字符
h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值
i) s.~string() //销毁所有字符,释放内存
都很简单,我就不解释了。

2.字符串操作函数
这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。
a) =,assign() //赋以新值
b) swap() //交换两个字符串的内容
c) +=,append(),push_back() //在尾部添加字符
d) insert() //插入字符
e) erase() //删除字符
f) clear() //删除全部字符
g) replace() //替换字符
h) + //串联字符串
i) ==,!=,<,<=,>,>=,compare() //比较字符串
j) size(),length() //返回字符数量
k) max_size() //返回字符的可能最大个数
l) empty() //判断字符串是否为空,是空时返回ture,不是空时返回false
m) capacity() //返回重新分配之前的字符容量
n) reserve() //保留一定量内存以容纳一定数量的字符
o) [ ], at() //存取单一字符
p) >>,getline() //从stream读取某值
q) << //将谋值写入stream
r) copy() //将某值赋值为一个C_string
s) c_str() //将内容以C_string返回
t) data() //将内容以字符数组形式返回
u) substr() //返回某个子字符串
v)查找函数
w)begin() end() //提供类似STL的迭代器支持
x) rbegin() rend() //逆向迭代器
y) get_allocator() //返回配置器

以下代码为获取指定地址下的全部文件,将获取的地址创建并放入指定表格:

#include<io.h>
#include<stdio.h>
#include<string>
#include"iostream"
//#include"fstream"
#include<vector>
#define N 999using namespace std;void diaoyong();void file(string path, vector<string>& files);void getFiles(string path, vector<string>& files)
{//文件句柄,此处intptr_t是用于跨平台运行,//例如原本在32位电脑所用文件地址编码long即可,//但在64位电脑中运行则需要long long而我们使用intptr_t即可解决这一问题intptr_t  hFile = 0;//文件信息struct _finddata_t fileinfo;string p;if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1){do{//如果是目录,迭代之//如果不是,加入列表if ((fileinfo.attrib & _A_SUBDIR)){if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)getFiles(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);}}int main() {string Filepath;cout << "请输入文件查询地址(格式为D:\\*):" << endl;cin >> Filepath;char  filename[N];printf("请输入所用的文件名(格式为D:\\*.csv):\n");//scanf_s("%s", filename, N);cin >> filename;vector<string> files;FILE* fp;char str[N] = { 0 }, strTemp[N];//获取该路径下的所有文件// file(Filepath, files);getFiles(Filepath, files);if ((fopen_s(&fp, filename, "at+")) != NULL) {puts("Fail to open file!");exit(0);}int size = files.size();for (int i = 0; i < size; i++){memset(str, 0, sizeof(str));cout << files[i].c_str() << endl;strcat_s(str, "\r");strcat_s(str, files[i].c_str());fputs(str, fp);}fclose(fp);int j;diaoyong();return 0;
}void diaoyong() {cout << "输入9退出,输入1继续:" << endl;int i = 0;cin >> i;if (i == 1) {main();}else if (i == 9) {return;}else {return;}
}

运行结果:

D:\1下文件:

D:\1\2下文件

最后生成的表格及存储内容:

参考链接
vector的使用方法

c++中的string常用函数用法总结

_finddata_t 结构体用法

【C++】获取文件夹里所有文件名,可直接运行相关推荐

  1. python获取文件夹里有什么文件+查看特定格式的文件

    python获取文件夹里有什么文件+查看特定格式的文件 功能 程序 效果 后续 功能 获取文件夹的的文件+获取文件夹里的特定格式的文件,比如.png等 程序 import os folder = r& ...

  2. php获取文件夹下所有文件名(php遍历目录)

    当我对接小发猫API的时候,需要php获取文件夹下所有文件名,我们有时候需要读取目录里面的内容,在 PHP 有多个函数可以获取文件系统目录信息,今天就给大家分享 PHP 遍历目录的三种方法. php获 ...

  3. 如何把文件夹里的文件名快速导出到excel表格里(适合所有windows系统)

    正文 有时我们需要把文件夹里的文件名整理起来做成一个表格,可是文件太多,一个一个复制很麻烦,所以小编就告诉大家一个超级简单的方法来解决这个问题!用win7做示范,这个学会了其他系统也是大同小异的. 工 ...

  4. SFTP获取文件夹内的文件名,文件大小,文件修改时间

    SFTP获取文件夹内的文件名,文件大小,文件修改时间 使用SFTP协议获取服务上的指定路径的文件夹下的所有文件名,文件大小,文件的修改时时间等. 工具类 import java.io.File; im ...

  5. 把文件夹里的文件名快速导出到Excel表格里,并且重命名成中文,防乱码

    把文件夹里的文件名快速导出到Excel表格里 打开cmd dir 需要整理的文件地址/b>需要放置的位置\需要整理的文件.xls 例:dir d:\123/b>d:\new.xls 重命名 ...

  6. 【Windows】Windows10系统获取文件夹下的文件名方法

    在工作过程中经常会碰到需要获得文件夹下文件名的情况,而如果手动获取的话,不仅太慢还很容易出错,这该怎么办呢?下面教大家在win10系统中快速获取文件夹下文件名的方法. 工具/原料 Windows10 ...

  7. python获取文件夹名称、文件名、去除后缀的文件名、文件改名等

    当前目录下所有文件夹下的文件名(不带后缀)写入对应txt文件(以文件夹命名)中 重命名文件 getfiledata.py # 当前目录下所有文件夹下的文件名(不带后缀)写入对应txt文件(以文件夹命名 ...

  8. python获取文件夹下所有文件名

    在对文件进行操作时,某些时候需要获取当前文件夹下所有文件的文件名,如获取"E:\工作表格\数据统计\网站日志\日志",这个目录下所有文件的名字 在Windows系统命令行窗口下,查 ...

  9. 获取文件夹下的文件名并存入txt中

    import os path_imgs='C:/Users/13451/Desktop/pic' #图片存放的地址 for files in os.listdir(path_imgs): #listd ...

最新文章

  1. 广州牵引力教育 互联网+企业应用人才名企双选会广州场来啦!
  2. 如何在CentOS 7中禁止IPv6
  3. C语言基础:数组作为函数参数传递演示源码
  4. Hadoop Writable机制
  5. Scala 类型的类型(一)
  6. delphi里用java_如何在整个Delphi应用程序中使用ID
  7. 云服务器一直显示关机中,云服务器一直提示关机中
  8. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
  9. netty系列之:搭建自己的下载文件服务器
  10. python使用redis_python应用中使用redis的几个思考
  11. html中电子邮件怎么写,谈html mailto(电子邮件)实际应用
  12. resultmap的写法_如何向resultMap中的collection中配置的select传递条件
  13. 多源最短路径---Floyd-Warshall算法
  14. 这一天,我用 Rust 重写了已有 19 年历史的 C++ 库!
  15. OpenCV合并图片cv2.add、无缝连接图片cv2.addWeighted、图片克隆cv2.seamlessClone 效果对比、按位运算bitwise_and
  16. 百度、微博的大数据算法Top10热搜怎么实现?
  17. Android应用内展示office文件--腾讯浏览服务(TBS)
  18. windows服务器安全设置详解攻略
  19. 基于AD7705的超高精度电压采集电路板 4路电压采集端口,通过前端通过AD620运算放大器输出至AD5505通过STM32F030数据处理
  20. Linux系统yum源的三种配置方法

热门文章

  1. 【matlab函数】——str2func函数的使用
  2. 爬取2020东京奥运会的所有赛事的情况,并分类输出,使用Python实现
  3. Ubuntu重装与重新分区
  4. 双系统中的linux如何重装系统,最详细的双系统重装ubuntu系统教程
  5. 计算机抽象思维 pdf,抽象思维在计算机中的应用与体现.pdf
  6. C语言泰勒公式求sin(x)值
  7. 外汇海龟交易法则是什么
  8. openwrt安装appfilter实现家长控制
  9. Pytest系列:csdn最最最详细,听不懂你找我。 skip、skipif跳过用例
  10. MongoDB--命令--常用/查看信息