我正在做一个程序,我需要得到所有文件的名称和pathstringarray.I可以通过这样做的文件和文件夹path:
HANDLE hFind; WIN32_FIND_DATA data; string folder="C:\\*.*"; int num=0; string addresses[1000]; hFind=FindFirstFile(folder.c_str(),&data); if(hFind!=INVALID_HANDLE_VALUE){ do{ addresses[num]=folder.substr(0,folder.length()-3); addresses[num]+=data.cFileName; num++; }while(FindNextFile(hFind,&data)); FindClose(hFind);}
但它只获取文件夹和文件夹名称path只在该文件夹中。我需要获取该文件夹的所有文件和它的子文件夹。如何可以做到这一点?如果可能的话,请使用函数返回string数组。
将代码重构为函数,并在获取目录条目时递归地调用它(请记住跳过和..)。 目录可以通过检查是否在data.dwFileAttributes(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)中设置目录位来检测。
C:不要这样做,因为你需要等很长时间。 对于开发创建目录C:\ Tests并放置几个文件和文件夹。
#include <windows.h> #include <string> #include <vector> #include <iostream> using namespace std; // TODO: needs proper error checking, for example when given not existing path. void GetFilesR( vector<string>& result, const char* path ) { HANDLE hFind; WIN32_FIND_DATA data; string folder( path ); folder += "\\"; string mask( folder ); mask += "*.*"; hFind=FindFirstFile(mask.c_str(),&data); if(hFind!=INVALID_HANDLE_VALUE) { do { string name( folder ); name += data.cFileName; if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { // Skip . and .. pseudo folders. if ( strcmp( data.cFileName, "." ) != 0 && strcmp( data.cFileName, ".." ) != 0 ) { // TODO: if you want directories appended to result, do it here. // Add all files from this directory. GetFilesR( result, name.c_str() ); } } else { result.push_back( name ); } } while(FindNextFile(hFind,&data)); } FindClose(hFind); } int main( int argc, char* argv[] ) { vector<string> files; // TODO: change directory below. GetFilesR( files, "C:\\Tests" ); // Print collected files. for ( vector<string>::iterator i = files.begin() ; i != files.end() ; ++i ) cout << *i << "\n"; return 0; }
使用命名空间标准,可以删除,如果你更换所有的实例关闭矢量宽度标准::矢量,字符串与标准偏差::字符串与标准:: cout的一个cout。