【问题标题】:The os.path equivalent in C++ without Qt?没有 Qt 的 C++ 中的 os.path 等效项?
【发布时间】:2017-03-14 22:43:46
【问题描述】:

我需要设置一个目录,然后读取里面文件的所有文件名,并将整个路径存储在一个变量中。稍后我需要使用这个变量来打开文件并读取它。我不想为此使用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)

【问题讨论】:

  • 避免将您的可执行文件命名为 test。它是标准的 POSIX 程序 /bin/test 或内置的 shell。调用你的测试二进制文件mytest
  • 为什么不简单地使用 cv::glob?
  • @BasileStarynkevitch 我从链接中的另一个问题复制了test。我只是继续在剩下的问题中使用它。
  • @Miki 谢谢你的建议。看起来我可以完成我的工作。

标签: c++ command-line filesystems os.path


【解决方案1】:

对于 Linux 或 POSIX ....

您可能会使用低级别的nftw(3)opendir(3) & readdir(3) 等...当然您需要处理脏细节(跳过. & .. 条目,组装文件路径从条目和目录路径,处理错误等...)。您可能还需要stat(2)。 您应该阅读Advanced Linux Programmingsyscalls(2) 以获得更广阔的视野。

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

顺便说一句,你可以查看QDir的Qt源代码

您也可以考虑使用POCO

【讨论】:

    【解决方案2】:

    您的选择是使用 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);
      }
    }
    

    【讨论】:

    • 我想我会使用 boost 并创建一个文件,其中包含在创建对象时应该调用的所有内容。你怎么看?
    • 听起来是最可靠的方法。几年后,将如此大的捆绑包带入此类小问题的需求将减少。
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2016-10-11
    相关资源
    最近更新 更多