【问题标题】:How to refer to files in folder by file extension如何通过文件扩展名引用文件夹中的文件
【发布时间】:2023-04-07 19:57:01
【问题描述】:

我将一个表示文件夹路径的字符串作为参数传递给构造函数。

文件夹名称,其中的文件及其名称可以不同,但​​两个文件的扩展名始终相同: *.caffemodel*.prototxt

如何使用扩展名引用指定目录中的这两个文件,而无需扫描整个文件夹以获取它们的完整名称?

作为一个例子,这里是我班级的代码:

#include "NeuralClassifier.hpp"


NeuralClassifier::NeuralClassifier(std::string path)
{
  std::string modelName = path + "/*.caffemodel";
  std::string protoName = path + "/*.prototxt";
  cv::dnn::Net net;
  try {
    net = dnn::readNetFromCaffe(protoName, modelName);
  }
  catch (cv::Exception& e) {
    std::cerr << "Exception: " << e.what() << std::endl;
    if (net.empty())
    {
      std::cerr << "Can't load network by using the following files: " << std::endl;
      std::cerr << "prototxt:   " << protoName << std::endl;
      std::cerr << "caffemodel: " << modelName << std::endl;
      std::cerr << "bvlc_googlenet.caffemodel can be downloaded here:" << std::endl;
      std::cerr << "http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel" << std::endl;
      exit(-1);
    }
  }
}

【问题讨论】:

  • 这不是 C++ 特定的问题,即使您要对某些 ​​nix 实用程序进行系统调用;我认为没有任何文件系统可以在不扫描目录中的节点的情况下本机支持这一点;不过我可能是错的,我很高兴得到纠正......
  • 只是好奇,如果您已经拥有path,是什么阻止您将fileName 指定为类中的某些字段,在构造函数中使用getter/setter 和/或额外参数,或者更好的是,在构造函数中使用整个路径作为参数?
  • 感谢您的回复。假设我有许多不同的文件夹,并且这些文件夹中的文件名发生了变化。我想用不同的模型测试代码(基本上加载不同的文件夹),而不是每次都重写路径和有时又长又无聊的文件名,我认为可以只更改路径。显然,从您所说的来看,如果不扫描目录或以某种方式使用正则表达式是不可能的。
  • @FrancescoBoi 我明白了。然后我想文件夹路径也是由其他地方的一些代码生成的。如果您只是增强生成文件夹路径的那段代码以生成文件的完整路径,而不是试图通过扩展名找出对文件名的一些特殊处理,也许它会更整洁。
  • 文件夹和模型不是我的代码生成的,而是其他工作生成的。我想采用其他人训练的模型。

标签: c++ filenames file-extension


【解决方案1】:

在某些时候操作系统需要知道您的应用程序想要打开的确切文件名。在您的情况下,您指定一个通配符“*”,它可以与多个文件不匹配。

如果您只想打开与通配符匹配的第一个文件,您可以使用 boost::filesystem 来简化文件处理:

Can I use a mask to iterate files in a directory with Boost?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2017-05-28
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多