在C++中读取文件系统时出现问题(Boost 未编译)

Problems reading FileSystem in C++ (Boost not compiling)

本文关键字:问题 Boost 编译 C++ 读取 文件系统      更新时间:2023-10-16

我正在尝试编写一个C++程序,该程序需要递归扫描目录中的特定扩展名的所有文件,并获取其文件路径和上次修改的数据。

根据我的研究,Stack OverFlow的建议似乎是使用C++17/"boost/filesystem.hpp"库来实现这一点。

我在 17.12 位 Windows 10 机器上使用 Code::Blocks 17.12 32 位和 MinGW GCC 5 32 位。该编译器不识别为内置库(这是正确的,因为直到GCC 7才引入(。是否有可用的MinGW GCC 7编译器?

在没有这个编译器的情况下,我尝试使用此处找到的算法,它无法识别我通过它放置的任何目录。

vector< pair<string, FILETIME> > searchDir(const string searchPath, const string searchStr) {
// Function to get list of files and their last modified date from a directory
cout << "searchDir(" << searchPath << ", " << searchStr << ")" << endl;
string filePath;
FILETIME lastEdit;
vector< pair<string, FILETIME> > files;

struct _finddata_t dirFile;
intptr_t hFile;
//if (( hFile = _findfirst( searchPath.c_str(), &dirFile )) != -1 )
if (( hFile = _findfirst( "C:/", &dirFile )) != -1 )
{
do
{
if ( !strcmp( dirFile.name, "."   )) continue; // Don't iterate through self
if ( !strcmp( dirFile.name, ".."  )) continue; // Don't iterate through parent dir
if ( TRUE )
{
if ( dirFile.attrib & _A_HIDDEN ) continue;
if ( dirFile.name[0] == '.' ) continue;
}
// dirFile.name is the name of the file
string fileName = dirFile.name;
cout << fileName << endl;
int len = fileName.length();
string ext = fileName.substr(len-4, len - 1);
if ( !ext.compare(searchStr))
{
// Found a match
FileTimes f(filePath);
pair<string, FILETIME> file (filePath, f.getWritten());
files.push_back(file);
}

} while ( _findnext ( hFile, &dirFile ) == 0 );
_findclose( hFile );
} else {cout << "Search Path not found" << endl;}

return files;
}

由于这次失败,我尝试改用 Boost。我能够使用预构建的标头在 Code::Blocks 中编译程序,但没有需要编译的库,并且编译失败,说"gcc"不是一个有效的命令。

具有 gcc.exe 的目录是 "C:\Program Files (x86(\CodeBlocks\MinGW\bin",具有 boost 的目录是 "C:\Program Files\Boost\boost_1_67_0">

我在 boost 目录中以管理员身份运行命令提示符,将 gcc 目录分配为我的路径变量,然后尝试编译:

cd C:Program FilesBoostboost_1_67_0
path C:Program Files (x86)CodeBlocksMinGWbin %path%
bootstrap mingw

"gcc"不是公认的内部或外部命令,

###
### Using 'mingw' toolset.
###
C:Program FilesBoostboost_1_67_0toolsbuildsrcengine>if exist bootstrap rd /S /Q bootstrap 
C:Program FilesBoostboost_1_67_0toolsbuildsrcengine>md bootstrap 
C:Program FilesBoostboost_1_67_0toolsbuildsrcengine>gcc -DNT -o bootstrapjam0.exe  command.c compile.c constants.c debug.c execcmd.c execnt.c filent.c frames.c function.c glob.c hash.c hdrmacro.c headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c object.c option.c output.c parse.c pathnt.c pathsys.c regexp.c rules.c scan.c search.c subst.c timestamp.c variable.c modules.c strings.c filesys.c builtins.c md5.c class.c cwd.c w32_getreg.c native.c modules/set.c modules/path.c modules/regex.c modules/property-set.c modules/sequence.c modules/order.c 
C:Program FilesBoostboost_1_67_0toolsbuildsrcengine>exit /b 9009

最后,我并不特别关注三种方法中的哪一种,因为我正在编写 3 个具有共享库的程序,这些程序只能在我的机器上运行,而另一个是相同的。我不担心便携性或速度。

谢谢!

Windows 中的 PATH 环境变量是一个用 ; 分隔的长字符串。 因此,在添加新目录时,应将其添加为;(分号(。

path C:Program Files (x86)CodeBlocksMinGWbin; %path%