vc下遍历指定路径下的文件名

    技术2025-05-01  33

    编写初衷 

    拟在指定文件夹下新建txt文档并写入数据,采用简单的 0.txt  1.txt ……1001.txt格式命名,每次有新建文本需求时,首先遍历该路径下已经有的文件名所启用的数字,选择未启用的数字或者依照顺序依次命名。

     

     

    如图实例,已有文件名见图。

    希望代码可以做到,遍历路径后得到0-3,5-6的数字,然后启用4作为新文件名称,如果4.txt已经存在,那么将新建7.txt。

     

    流程

     

    针对以上目的,数据的代码处理流程主要有:

    1、输入指定的路径,获取该文件夹下指定类型的文件名称;

    2、从文件名称中拆解数字部分;

    3、将这些数字保存在指定结构;

    4、对应数据保存,以供下阶段使用。

     

    具体代码

     

    接口代码见下。可以实现:遍历路径下所有的txt文本并将数字保存。

    为了在将名称和文件名对应,甚至后续数据,临时保存的数据结构如下(当然,文件名和实际工程中的其他变量对应,可以类比添加),数据对应保存便于同步更新。

     

    typedef struct { int id; char fileName[MAXFILENAMELENGTH]; int fileNameNum; }FileFindInfo; typedef struct { int fileNum; FileFindInfo fileFindInfo [MAXFILENUM]; }FileFind; FileFind fileFind;

     

    需要特殊注意的:

    1、路径为 string 类型,存放在char数组中,string 转为 char 用 strcpy_s;

    2、字符串转为int类型用 atoi;

    3、拆分路径获取文件名称用 _splitpath;

     

    #include "StdAfx.h" #include<windows.h> #include<iostream> #include<string> #include"direct.h" #include <io.h> //_access函数的头文件 #include <stdio.h> using namespace std; #define MAXFILENAMELENGTH 500 #define MAXFILENUM 10000 #define _MAX_DRIVE 5 #define _MAX_DIR 100 #define _MAX_DRIVE 50 #define _MAX_DRIVE 10 char drive[_MAX_DRIVE] = {0}; char dir[_MAX_DIR] = {0}; char fname[_MAX_FNAME] = {0}; char ext[_MAX_EXT] = {0}; bool IsRoot(string Path); void FindAllTxt(string Path); int fileNum; // 查找的路径下还有子文件,暂时不考虑,该函数不被调用 bool IsRoot(string Path) { string Root; Root=Path.at(0)+"://"; if(Root==Path) return true; else return false; } void FindAllTxt(string Path) { string szFind; szFind=Path+"//*.txt"; char drive[_MAX_DRIVE] = {0}; char dir[_MAX_DIR] = {0}; char fname[_MAX_FNAME] = {0}; char ext[_MAX_EXT] = {0}; int fileNameNum = 0; WIN32_FIND_DATA FindFileData; HANDLE hFind=FindFirstFile(szFind.c_str(),&FindFileData); if(hFind==INVALID_HANDLE_VALUE) return; do { if(FindFileData.cFileName[0]=='.')//过滤本级目录和父目录 continue; string szFile; szFile=Path+FindFileData.cFileName; fileFind.fileFindInfo[fileNum].id=fileNum; strcpy_s(fileFind.fileFindInfo[fileNum].fileName,MAXFILENAMELENGTH,szFile.c_str()); _splitpath(szFile.c_str(), drive, dir, fname, ext ); fileNameNum=atoi(fname); fileNum++; fileFind.fileNum=fileNum; } while(FindNextFile(hFind,&FindFileData)); FindClose(hFind); }

     

    注意事项

     

    (1)数据结构依照个人需求增删;

    (2)该代码是简化版,只做当前路径下所有的txt检查,不再会去检查是否还有文件夹;

    (3)注意路径名的字符长度和路径下文件数量修改宏定义。

     

    Processed: 0.014, SQL: 9