




В Windows вы можете использовать GetFileAttributes на открытая ручка.
Вызовите 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
}
единственная проблема, с которой я столкнулся с этим кодом, - это комментарий в случае else. То, что что-то не является каталогом, не означает, что это файл.
@dicroce: Да, это правда; фиксированный.
когда я пытаюсь использовать это, я получил «агрегат‘ main (int, char **) :: stat s ’имеет неполный тип и не может быть определен» и действительно не мог понять, в чем заключается ошибка. Сначала выдает ошибку в строке struct stat s; В чем может быть моя ошибка?
Хорошо, мне нужно было добавить #include <sys / stat.h>, моя проблема :)
есть ли перегрузка или аналогичная функция, поддерживающая широкий путь символов?
В Win32 я обычно использую PathIsDirectory и его сестринские функции. Это работает в Windows 98, чего нет в GetFileAttributes (согласно документации MSDN).
Я не пробовал, но самая ранняя задокументированная версия распространялась с Windows 95, так что, вероятно, нет.
Вы, безусловно, можете использовать GetFileAttributes() в Windows 98, и, как ни странно, он появился раньше PathIsDirectory(). Вы не можете полагаться на документацию MSDN при проверке минимальных требований к ОС для API, потому что MSDN лжет! Когда MS отказывается от поддержки версии ОС, они предпочитают удалить большинство ссылок на нее из документации MSDN, особенно в минимальных требованиях к ОС для существующих API.
Проще попробовать FileInfo.isDir () в qt
Не могли бы вы объяснить, зачем использовать библиотеку с графическим интерфейсом, когда речь идет о доступе к файловой системе?
Спасибо, это именно то, что я искал. (Через Google.)
зачем ты сюда «притащил» qt?
Если вы используете 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 Clang поддерживает std::filesystem. Обязательно используйте Clang 7 или новее с опцией -std=c++17. Минимальный пример в проводнике компилятора.
Это простой метод, использующий функцию GetFileAttributesW, чтобы проверить, является ли путь каталогом в Windows. Если полученный путь должен быть каталогом или путем к файлу, тогда, если это не путь к каталогу, вы можете предположить, что это путь к файлу.
bool IsDirectory(std::wstring path)
{
DWORD attrib = GetFileAttributes(path.c_str());
if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
return true;
return false;
}
Если вам нужна поддержка Windows 98, вы не можете использовать эту функцию. См. Мой ответ о PathIsDirectory ниже, если вам нужна поддержка Win98.