没有 Qt 的 C++ 中的 os.path 等价物?

The os.path equivalent in C++ without Qt?

我需要设置一个目录,然后读取里面文件的所有文件名,并将整个路径存储在一个变量中。稍后我需要使用这个变量来打开文件并读取它。我不想为此使用 QDir。我看到问题的第二个答案here。我可以用boost/filesystem.hpp(相信这个不用单独下载)。但问题是执行将如下所示:

$ g++ -o test test.cpp -lboost_filesystem -lboost_system
$ ./test  

我的第一行,用于创建可执行对象,由于 OpenCV 库已经很复杂,我不想添加它。我想让它们保持简单(以下行加上 OpenCV 想要的任何内容):

g++ -o test test.cpp 

有什么办法吗?

这是我要为其编写 C++ 代码的 python 代码:

root_dir = 'abc'
img_dir = os.path.join(root_dir,'subimages')

img_files = os.listdir(img_dir)
for files in img_files:
    img_name = os.path.join (img_dir,files)
    img = cv2.imread(img_name)

您的选择是使用 boost、QDir、自己动手,或者使用更新的编译器,该编译器采用了为 C++17 准备的一些 TR2 功能。下面是一个示例,它大致应该使用 C++17 功能以系统不可知的方式遍历文件。

#include <filesystem>
namespace fs = std::experimental::filesystem;
...
fs::directory_iterator end_iter;
fs::path subdir = fs::dir("abc") / fs::dir("subimages");
std::vector<std::string> files;

for (fs::directory_iterator dir_iter(subdir); dir_iter != end_iter; dir_iter++) {
  if (fs::is_regular_file(dir_iter->status())) {
    files.insert(*dir_iter);
  }
}

对于Linux或POSIX....

您可以使用低级别 nftw(3) or opendir(3) & readdir(3) etc... Of course you'll need to deal with dirty details (skipping . & .. entries, assembling the file path from the entry and the directory path, handling errors, etc...). You might also need stat(2)。 您应该阅读 Advanced Linux Programming & syscalls(2) 以获得更广阔的视野。

对于其他操作系统(特别是 Windows),您需要其他低级功能。

顺便说一句,您可以查看 QDir

的 Qt 源代码

您也可以考虑使用 POCO