web-dev-qa-db-fra.com

Comment savoir si un chemin donné est un répertoire ou un fichier? (C / C ++)

J'utilise C et parfois je dois gérer des chemins comme

  • C:\Peu importe
  • C:\Peu importe \
  • C:\Quelque soit\Unfichier

Existe-t-il un moyen de vérifier si un chemin donné est un répertoire ou un chemin donné est un fichier?

39
DylanJ

Appelez GetFileAttributes et recherchez l'attribut FILE_ATTRIBUTE_DIRECTORY.

28
Colen

stat () vous le dira.

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
}
103
Mike F

Dans Win32, j'utilise habituellement PathIsDirectory et ses fonctions sœurs. Cela fonctionne dans Windows 98, ce que GetFileAttributes ne fait pas (selon la documentation MSDN.)

13
jeffm

Avec C++ 14/C++ 17, vous pouvez utiliser la plateforme indépendante is_directory() et is_regular_file() à partir de bibliothèque de système de fichiers .

#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();
    }
}

En C++ 14, utilisez std::experimental::filesystem .

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

Les vérifications supplémentaires implémentées sont répertoriées dans section "Types de fichiers" .

9
Roi Danton

Sous Windows, vous pouvez utiliser GetFileAttributes sur un poignée ouverte .

2
Scott