Как мне убедиться, что строка содержит один элемент, а также не содержит другого? // Как мне проверить тип файла?

#c #string #find

Вопрос:

У меня есть путь к файлу fileLocation (исходящий от a std::filesystem::recursive_directory_iterator ), и я пытаюсь определить, относится ли он к типу «.png». Я ожидаю, что каталоги файлов, файлы png и файлы mcmeta будут содержать строку .png в их имени.

другими словами, мне нужно утверждение if, которое будет отделяться C:filesfile.png от C:files и C:filesfile.png.mcmeta

Я пытался

 if (fileLocation.path().string().find(".png") == fileLocation.path().string().size()-4) {/*...*/}
 

но по какой-то причине он вернул только ложное значение в файле, который появился после файла, который не был png.

Комментарии:

1. Может быть, вы хотите взглянуть на само расширение: https://en.cppreference.com/w/cpp/filesystem/path/extension

2. Вы можете использовать std::string::length() или std::string::size проверить, содержит ли строка один элемент.

3. Вы действительно не можете проверить тип файла, если у вас нет какого-либо идентификатора внутри файла. Во многих операционных системах имя не обязательно должно относиться к типу или назначению файла. Возьмем, к примеру, печально известное расширение «.dat». У меня также может быть исполняемый файл с расширением «.txt». Кроме того, пример «.h» — вы не знаете, является ли это заголовком C или заголовком языка C.

4. @ThomasMatthews это сработало. Я предлагаю вам использовать это как ответ, чтобы я мог его принять.

Ответ №1:

Я использую что-то вроде следующего для более сложных поисков, основанных на соглашениях об именах файлов:

 #include <filesystem>
#include <iostream>
#include <string>
#include <vector>
namespace fs = std::filesystem;
int main(int argc, char** argv) {
  std::string input_dir{"/home/user/Pictures/"};
  std::vector<std::string> pngs;
  for(autoamp; f : fs::directory_iterator(input_dir)) {
    auto fn = f.path().filename().string();
    auto ext = fn.substr(fn.rfind("."), fn.size()-1);
    if(ext.find(".png") != std::string::npos)
      pngs.push_back(fn);
    else
      std::cout << fn << " is not a png.n";
  }
  return EXIT_SUCCESS;