Подтвердить что ты не робот

Как вы проверяете, существует ли каталог в Windows на C?

Вопрос

В приложении Windows C я хочу проверить параметр, переданный в функцию, чтобы убедиться, что указанный путь существует. *

Как вы проверяете, существует ли каталог в Windows в C?

* Я понимаю, что вы можете попасть в условия гонки, когда вы проверяете существование и время, когда вы используете путь, которого он больше не существует, но я могу справиться с этим.

Дополнительный фон

Знание явно, что каталог существует или не существует, может оказаться сложным, когда разрешаются права доступа. Возможно, что при попытке определить, существует ли каталог, процесс не имеет прав доступа к каталогу или родительскому каталогу. Это нормально для моих нужд. Если каталог не существует ИЛИ я не могу получить к нему доступ, то оба приложения рассматриваются как недопустимый сбой пути в моем приложении, поэтому мне не нужно различать. (Virtual), если ваше решение предусматривает это различие.

Любое решение на языке C, библиотеке времени выполнения C или Win32 API прекрасно, но в идеале я хотел бы придерживаться обычно загружаемых библиотек (например, kernel32, user32 и т.д.) и избегать решений, -стандартные библиотеки (например, PathFileExists в Shlwapi.dll). Опять же, (виртуальные) бонусные баллы, если ваше решение кросс-платформенное.

Похожие

Как проверить, существует ли файл или нет с помощью программы Win32?

4b9b3361

Ответ 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()

Эта функция "Определяет, действителен ли путь к объекту файловой системы, такой как файл или каталог".