拟在指定文件夹下新建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)注意路径名的字符长度和路径下文件数量修改宏定义。