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