J'utilise C et parfois je dois gérer des chemins comme
Existe-t-il un moyen de vérifier si un chemin donné est un répertoire ou un chemin donné est un fichier?
Appelez GetFileAttributes et recherchez l'attribut FILE_ATTRIBUTE_DIRECTORY.
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
}
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.)
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" .
Sous Windows, vous pouvez utiliser GetFileAttributes sur un poignée ouverte .