Как я могу определить, является ли данный путь каталогом или файлом? (C / C++)

Я использую C, и иногда мне приходится обрабатывать такие пути, как

  • C: \ Что угодно
  • C: \ Что угодно \
  • C: \ Что угодно \ Somefile

Есть ли способ проверить, является ли заданный путь каталогом или заданным путем файлом?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
40
0
80 472
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

В Windows вы можете использовать GetFileAttributes на открытая ручка.

Ответ принят как подходящий

Вызовите GetFileAttributes и проверьте атрибут FILE_ATTRIBUTE_DIRECTORY.

Если вам нужна поддержка Windows 98, вы не можете использовать эту функцию. См. Мой ответ о PathIsDirectory ниже, если вам нужна поддержка Win98.

jeffm 29.09.2008 03:29

stat () сообщит вам об этом.

struct stat s;
if ( stat(path,&s) == 0 )
{
    if ( s.st_mode & S_IFDIR )
    {
        //it's a directory
    }
    else if ( s.st_mode & S_IFREG )
    {
        //it's a file
    }
    else
    {
        //something else
    }
}
else
{
    //error
}

единственная проблема, с которой я столкнулся с этим кодом, - это комментарий в случае else. То, что что-то не является каталогом, не означает, что это файл.

dicroce 29.09.2008 03:27

@dicroce: Да, это правда; фиксированный.

Mike F 29.09.2008 04:54

когда я пытаюсь использовать это, я получил «агрегат‘ main (int, char **) :: stat s ’имеет неполный тип и не может быть определен» и действительно не мог понять, в чем заключается ошибка. Сначала выдает ошибку в строке struct stat s; В чем может быть моя ошибка?

MeM 30.03.2015 16:40

Хорошо, мне нужно было добавить #include <sys / stat.h>, моя проблема :)

MeM 30.03.2015 16:54

есть ли перегрузка или аналогичная функция, поддерживающая широкий путь символов?

mbaros 31.07.2016 22:25

В Win32 я обычно использую PathIsDirectory и его сестринские функции. Это работает в Windows 98, чего нет в GetFileAttributes (согласно документации MSDN).

Я не пробовал, но самая ранняя задокументированная версия распространялась с Windows 95, так что, вероятно, нет.

jeffm 05.05.2014 05:48

Вы, безусловно, можете использовать GetFileAttributes() в Windows 98, и, как ни странно, он появился раньше PathIsDirectory(). Вы не можете полагаться на документацию MSDN при проверке минимальных требований к ОС для API, потому что MSDN лжет! Когда MS отказывается от поддержки версии ОС, они предпочитают удалить большинство ссылок на нее из документации MSDN, особенно в минимальных требованиях к ОС для существующих API.

Remy Lebeau 02.08.2016 23:54

Проще попробовать FileInfo.isDir () в qt

Не могли бы вы объяснить, зачем использовать библиотеку с графическим интерфейсом, когда речь идет о доступе к файловой системе?

harper 23.08.2013 19:48

Спасибо, это именно то, что я искал. (Через Google.)

ens 15.09.2014 22:39

зачем ты сюда «притащил» qt?

Sнаđошƒаӽ 19.04.2015 20:43

Если вы используете CFile, вы можете попробовать

CFileStatus status;
    if (CFile::GetStatus(fileName, status) && status.m_attribute == 0x10){
       //it's directory
}

В C++ 14 / C++ 17 вы можете использовать независимые от платформы is_directory() и is_regular_file() из библиотека файловой системы.

#include <filesystem> // C++17
#include <iostream>
namespace fs = std::filesystem;

int main()
{
    const std::string pathString = "/my/path";
    const fs::path path(pathString); // Constructing the path from a string is possible.
    std::error_code ec; // For using the non-throwing overloads of functions below.
    if (fs::is_directory(path, ec))
    { 
        // Process a directory.
    }
    if (ec) // Optional handling of possible errors.
    {
        std::cerr << "Error in is_directory: " << ec.message();
    }
    if (fs::is_regular_file(path, ec))
    {
        // Process a regular file.
    }
    if (ec) // Optional handling of possible errors. Usage of the same ec object works since fs functions are calling ec.clear() if no errors occur.
    {
        std::cerr << "Error in is_regular_file: " << ec.message();
    }
}

В C++ 14 используйте std::experimental::filesystem.

#include <experimental/filesystem> // C++14
namespace fs = std::experimental::filesystem;

Дополнительные реализованные проверки перечислены в раздел «Типы файлов».

Привет, @Roi Danton, спасибо за ответ. Вы знаете, почему это не работает в macOS? Похоже, это связано с тем, что Clang не поддерживает эту библиотеку. Очень жаль, ИМО.

mannyglover 13.11.2018 19:15

@mannyglover Clang поддерживает std::filesystem. Обязательно используйте Clang 7 или новее с опцией -std=c++17. Минимальный пример в проводнике компилятора.

Roi Danton 13.11.2018 22:01

Это простой метод, использующий функцию GetFileAttributesW, чтобы проверить, является ли путь каталогом в Windows. Если полученный путь должен быть каталогом или путем к файлу, тогда, если это не путь к каталогу, вы можете предположить, что это путь к файлу.

bool IsDirectory(std::wstring path)
{
    DWORD attrib = GetFileAttributes(path.c_str());

    if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
        return true;

    return false;
}

Другие вопросы по теме