经过查询,在c++中批量提取文件的核心代码如下:
```cpp
void getFiles( string path, vector<string>& files )
{
//文件句柄
long 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);
}
}
void getFilesName( string path, vector<string>& files )
{
//文件句柄
long 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 );
getFiles( fileinfo.name, files );
}
else
{
//files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
files.push_back(fileinfo.name);
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
char* str2char(string src)
{
char *dst = new char[255];
int i;
for(i=0;i <=src.length();i++)
dst[i]=src[i];
dst[i] = '\0';
return dst;
}
``
我们可以通过调用以上函数来获取某个文件夹下的文件名称
其中函数getFiles()可以获取该文件夹下所有文件的完整路径,包括子文件夹;
函数getFilesName()可以借助getFiles()函数获取的完整路径,截取当前文件夹下的文件名
由于我的应用场景,仅仅是想获得当前文件夹下各个文件夹的名称,因此改进代码如下:
```cpp
**char* str2char(string src)
{
char* dst = new char[255];
int i;
for (i = 0; i <= src.length(); i++)
dst[i] = src[i];
dst[i] = '\0';
return dst;
}**
void getFilesName(string path, vector<string>& files)
{
//文件句柄
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)
files.push_back(fileinfo.name);
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int main()
{
//提取文件夹下文件名称
char path1[500] = "D:\\luping\\Model_Code\\1 Dataset\\2 Image_1005\\E";
vector<string> filenames2;
getFilesName(path1, filenames2);
//新建一个.txt文件,用于保存文件名
ofstream ofn("FileName.txt");
int numImg = filenames2.size();
for (int file_i = 0; file_i < numImg; file_i++)
{
string b2 = filenames2[file_i].c_str();//只存文件夹下文件夹的名称
char* testChar = str2char(b2);
char noSuffixName[500];
for (int j = 0; j < b2.size(); j++) {
noSuffixName[j] = testChar[j];
}
noSuffixName[b2.size()] = '\0';//输入结束符
//显示提取的文件名称
cout << "noSuffixName:" << noSuffixName << endl;//文件名称 (不包括文件扩展名)
//将文件名称保存到.txt文件
ofn << noSuffixName << endl;
}
ofn.close();
}
打印结果和保存于FileName.txt中的内容即为当前文件夹中各个子文件夹的名称
参考:
[批量提取文件夹中文件名(C++代码实现)
](https://blog.youkuaiyun.com/zhouxianen1987/article/details/78656835?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-78656835-blog-38141577.pc_relevant_3mothn_strategy_and_data_recovery&spm=1001.2101.3001.4242.1&utm_relevant_index=3)[C++获取文件夹下所有文件名称的三种方式](https://blog.youkuaiyun.com/zhangla1220/article/details/38141577?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-38141577-blog-89633025.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-38141577-blog-89633025.pc_relevant_default&utm_relevant_index=2)