это как проверить расширение файла в конкретном текстовом файле? - PullRequest
0 голосов
/ 26 октября 2011

Здравствуйте, я пытаюсь реализовать способ проверить расширение файла в определенном текстовом файле, код ниже, кажется, не делает то, что я хочу, но мне было интересно, если это несколько правильное направление, чтобы сделать это , если нет, то какая есть библиотека, которая позволила бы мне сделать это как можно меньше кода.

string fn = ".txt";
if(fn.substr(fn.find_last_of(".") + 1) == ".txt") {
    fprintf(stderr,"yes");
} else {
    fprintf(stderr,"no");
}

im на windows 7 32bit

Ответы [ 4 ]

1 голос
/ 06 марта 2018

Если вам нужно только это для работы в Windows, лучшее решение - использовать Win32 API PathMatchSpec .

Для вашего примера:

string fn = ".txt";
if(PathMatchSpecA(fn.c_str(), "*.txt") {
    fprintf(stderr,"yes");
} else {
    fprintf(stderr,"no");
}

Или как функция:

BOOL HasTxtFileExtension(LPCSTR filename)
{
    return PathMatchSpecA(filename, "*.txt");
}

Как и следовало ожидать, эта функция нечувствительна к регистру и корректно обрабатывает случай, когда каталог содержит точки, а файл - нет, например, C:\\directory.with.dots\\testtxt.

1 голос
/ 26 октября 2011

Мое предпочтительное решение было бы boost::filesystem, как предполагает минус, но если нет:

static std::string const targetExtension( ".txt" );
if ( filename.size() >= targetExtension.size()
        && std::equal( filename.end() - targetExtension.size(),
                       filename.end(),
                       targetExtension.begin() ) ) {
    std::cerr << "yes";
} else {
    std::cerr << "no";
}

Мне бы это показалось самым простым.

1 голос
/ 26 октября 2011

fn.substr(fn.find_last_of(".") + 1) возвращает "txt" без точки.Поэтому либо удалите +1 из substr, либо сравните с "txt" без точки.

0 голосов
/ 26 октября 2011

Я думаю, что библиотека boost файловой системы должна помочь вам (функция расширения пути).

http://www.boost.org/doc/libs/release/libs/filesystem/index.html

...