Как я могу определить, является ли данный путь каталогом или файлом? (C/C++)
Я использую C, и иногда мне приходится обрабатывать такие пути, как
- C:\ Безотносительно
- C:\ Независимо \
- C:\ Независимо \ некий-файл
Есть ли способ проверить, является ли данный путь каталогом или данный путь файлом?
8 ответов
Вызовите GetFileAttributes и проверьте атрибут FILE_ATTRIBUTE_DIRECTORY.
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
}
С 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;
Дополнительные реализованные проверки перечислены в разделе "Типы файлов".
В Win32 я обычно использую PathIsDirectory и его родственные функции. Это работает в Windows 98, а GetFileAttributes - нет (согласно документации MSDN).
В Windows вы можете использовать GetFileAttributes с открытым дескриптором.
Это простой метод, использующий функцию GetFileAttributesW , чтобы проверить, является ли путь каталогом в Windows. Если полученный путь должен быть каталогом или путем к файлу, то, если это не путь к каталогу, вы можете предположить, что это путь к файлу.
bool IsDirectory(std::wstring path)
{
DWORD attrib = GetFileAttributes(path.c_str());
if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
return true;
return false;
}
Если вы используете CFile
ты можешь попробовать
CFileStatus status;
if (CFile::GetStatus(fileName, status) && status.m_attribute == 0x10){
//it's directory
}