我想获取给定文件夹(包括其子文件夹)中所有特定扩展名的文件名(包括扩展名),而不是完整文件路径。在Python等语言中非常简单,但我对C++中的构造不熟悉。如何实现?
我想获取给定文件夹(包括其子文件夹)中所有特定扩展名的文件名(包括扩展名),而不是完整文件路径。在Python等语言中非常简单,但我对C++中的构造不熟悉。如何实现?
#define BOOST_FILESYSTEM_VERSION 3
#define BOOST_FILESYSTEM_NO_DEPRECATED
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
/**
* \brief Return the filenames of all files that have the specified extension
* in the specified directory and all subdirectories.
*/
std::vector<fs::path> get_all(fs::path const & root, std::string const & ext)
{
std::vector<fs::path> paths;
if (fs::exists(root) && fs::is_directory(root))
{
for (auto const & entry : fs::recursive_directory_iterator(root))
{
if (fs::is_regular_file(entry) && entry.path().extension() == ext)
paths.emplace_back(entry.path().filename());
}
}
return paths;
}
using namespace std;
(应该加上)。 - bazz一个 C++17 代码
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
std::string path("/your/dir/");
std::string ext(".sample");
for (auto &p : fs::recursive_directory_iterator(path))
{
if (p.path().extension() == ext)
std::cout << p.path().stem().string() << '\n';
}
return 0;
}
std::endl
或将“p”变成一个const
变量。 - Raleigh L.在Windows上,你可以这样做:
void listFiles( const char* path )
{
struct _finddata_t dirFile;
long hFile;
if (( hFile = _findfirst( path, &dirFile )) != -1 )
{
do
{
if ( !strcmp( dirFile.name, "." )) continue;
if ( !strcmp( dirFile.name, ".." )) continue;
if ( gIgnoreHidden )
{
if ( dirFile.attrib & _A_HIDDEN ) continue;
if ( dirFile.name[0] == '.' ) continue;
}
// dirFile.name is the name of the file. Do whatever string comparison
// you want here. Something like:
if ( strstr( dirFile.name, ".txt" ))
printf( "found a .txt file: %s", dirFile.name );
} while ( _findnext( hFile, &dirFile ) == 0 );
_findclose( hFile );
}
}
在类Unix系统中,例如Linux或OsX:
void listFiles( const char* path )
{
DIR* dirFile = opendir( path );
if ( dirFile )
{
struct dirent* hFile;
errno = 0;
while (( hFile = readdir( dirFile )) != NULL )
{
if ( !strcmp( hFile->d_name, "." )) continue;
if ( !strcmp( hFile->d_name, ".." )) continue;
// in linux hidden files all start with '.'
if ( gIgnoreHidden && ( hFile->d_name[0] == '.' )) continue;
// dirFile.name is the name of the file. Do whatever string comparison
// you want here. Something like:
if ( strstr( hFile->d_name, ".txt" ))
printf( "found an .txt file: %s", hFile->d_name );
}
closedir( dirFile );
}
}
void getFilesList(string filePath,string extension, vector<string> & returnFileName)
{
WIN32_FIND_DATA fileInfo;
HANDLE hFind;
string fullPath = filePath + extension;
hFind = FindFirstFile(fullPath.c_str(), &fileInfo);
if (hFind != INVALID_HANDLE_VALUE){
returnFileName.push_back(filePath+fileInfo.cFileName);
while (FindNextFile(hFind, &fileInfo) != 0){
returnFileName.push_back(filePath+fileInfo.cFileName);
}
}
}
使用方法:您可以按照以下方式使用,从文件夹中加载所有文件并逐个循环遍历。
String optfileName ="";
String inputFolderPath ="";
String extension = "*.jpg*";
getFilesList(inputFolderPath,extension,filesPaths);
vector<string>::const_iterator it = filesPaths.begin();
while( it != filesPaths.end())
{
frame = imread(*it);//read file names
//doyourwork here ( frame );
sprintf(buf, "%s/Out/%d.jpg", optfileName.c_str(),it->c_str());
imwrite(buf,frame);
it++;
}
#include <dirent.h>
bool FindAllFiles(std::string path, std::string type, std::vector<std::string> &FileList){
DIR *dir;
struct dirent *ent;
FileList.clear();
if ((dir = opendir (path.c_str())) != NULL) {
//Examine all files in this directory
while ((ent = readdir (dir)) != NULL) {
std::string filename = std::string(ent->d_name);
if(filename.length() > 4){
std::string ext = filename.substr(filename.size() - 3);
if(ext == type){
//store this file if it's correct type
FileList.push_back(filename);
}
}
}
closedir (dir);
} else {
//Couldn't open dir
std::cerr << "Could not open directory: " << path << "\n";
return false;
}
return true;
}
显然,将所需的扩展名更改为您喜欢的任何内容。还假定为3个字符类型。
boost::filesystem
擅长文件操作。 - chrisboost::filesystem
的建议。 - Sergey Kalinichenko