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

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

  • C: \ Безотносительно
  • C: \ Независимо \
  • C: \ Whatever \ * 1008 некий-файл *

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

Ответы [ 7 ]

102 голосов
/ 29 сентября 2008

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
}
28 голосов
/ 29 сентября 2008

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

13 голосов
/ 29 сентября 2008

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

8 голосов
/ 07 апреля 2017

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;

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

2 голосов
/ 29 сентября 2008

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

0 голосов
/ 14 сентября 2015

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

CFileStatus status;
    if (CFile::GetStatus(fileName, status) && status.m_attribute == 0x10){
       //it's directory
}
0 голосов
/ 23 августа 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...