#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;