Как вы проверяете, существует ли каталог в Windows на C?
Вопрос
В приложении Windows C я хочу проверить параметр, переданный в функцию, чтобы убедиться, что указанный путь существует. *
Как вы проверяете, существует ли каталог в Windows в C?
* Я понимаю, что вы можете попасть в условия гонки, когда вы проверяете существование и время, когда вы используете путь, которого он больше не существует, но я могу справиться с этим.
Дополнительный фон
Знание явно, что каталог существует или не существует, может оказаться сложным, когда разрешаются права доступа. Возможно, что при попытке определить, существует ли каталог, процесс не имеет прав доступа к каталогу или родительскому каталогу. Это нормально для моих нужд. Если каталог не существует ИЛИ я не могу получить к нему доступ, то оба приложения рассматриваются как недопустимый сбой пути в моем приложении, поэтому мне не нужно различать. (Virtual), если ваше решение предусматривает это различие.
Любое решение на языке C, библиотеке времени выполнения C или Win32 API прекрасно, но в идеале я хотел бы придерживаться обычно загружаемых библиотек (например, kernel32, user32 и т.д.) и избегать решений, -стандартные библиотеки (например, PathFileExists в Shlwapi.dll). Опять же, (виртуальные) бонусные баллы, если ваше решение кросс-платформенное.
Похожие
Как проверить, существует ли файл или нет с помощью программы Win32?
Ответы
Ответ 1
Сделайте что-то вроде этого:
BOOL DirectoryExists(LPCTSTR szPath)
{
DWORD dwAttrib = GetFileAttributes(szPath);
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
Метод GetFileAttributes() включен в файл Kernel32.dll.
Ответ 2
Здесь полностью платформо-агностическое решение (с использованием стандартной библиотеки C)
Изменить: Для этого в Linux замените <io.h>
на <unistd.h>
и _access
на access
. Для реального агностического решения платформы используйте библиотеку Boost FileSystem.
#include <io.h> // For access().
#include <sys/types.h> // For stat().
#include <sys/stat.h> // For stat().
bool DirectoryExists( const char* absolutePath ){
if( _access( absolutePath, 0 ) == 0 ){
struct stat status;
stat( absolutePath, &status );
return (status.st_mode & S_IFDIR) != 0;
}
return false;
}
Реализация Windows, которая поддерживает как сборки MBCS, так и UNICODE:
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <tchar.h>
BOOL directory_exists( LPCTSTR absolutePath )
{
if( _taccess_s( absolutePath, 0 ) == 0 )
{
struct _stat status;
_tstat( absolutePath, &status );
return (status.st_mode & S_IFDIR) != 0;
}
return FALSE;
}
Ответ 3
Если ссылка на Shell Lightweight API (shlwapi.dll) подходит для вас, вы можете использовать функцию PathIsDirectory.
Ответ 4
Другой вариант - это функция оболочки PathFileExists()
Документация PathFileExists()
Эта функция "Определяет, действителен ли путь к объекту файловой системы, такой как файл или каталог".