Как проверить, существует ли каталог на Windows в C? - PullRequest
61 голосов
/ 02 июня 2011

Вопрос

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

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

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

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

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

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

Связано

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

Ответы [ 4 ]

86 голосов
/ 02 июня 2011

Сделайте что-то вроде этого:

BOOL DirectoryExists(LPCTSTR szPath)
{
  DWORD dwAttrib = GetFileAttributes(szPath);

  return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
         (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}

Метод GetFileAttributes () включен в Kernel32.dll.

23 голосов
/ 02 июня 2011

Вот полностью независимое от платформы решение (с использованием стандартной библиотеки 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;
}
9 голосов
/ 23 марта 2013

Если вам подходит ссылка на Shell Lightweight API (shlwapi.dll), вы можете использовать функцию PathIsDirectory .

4 голосов
/ 28 августа 2014

Другим вариантом является функция оболочки PathFileExists ()

PathFileExists () документация

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...