Как проверить, существует ли каталог в MFC (VC ++)? - PullRequest
8 голосов
/ 26 ноября 2010

Как проверить, существует ли каталог в MFC (VC ++)?Я использую приведенный ниже код, чтобы получить текущий путь к приложению, и там я создаю папку NDSLog, чтобы все мои файлы журналов помещались туда, теперь я хочу проверить условие, если папка NDSLog уже существует, не создавайте ее. Как это сделать?

Спасибо.

char strPathName[_MAX_PATH];
    ::GetModuleFileName(NULL, strPathName, _MAX_PATH);

    // The following code will allow you to get the path.
    CString newPath(strPathName);
    int fpos = newPath.ReverseFind('\\');

    if (fpos != -1)
    newPath = newPath.Left(fpos+1);     
    newPath += "NDSLog\\" ;

    CreateDirectory(newPath,NULL); 

Ответы [ 6 ]

22 голосов
/ 26 ноября 2010

Самый простой способ проверить, существует ли файл / каталог, это использовать GetFileAttributes:

if (GetFileAttributes(newPath) == INVALID_FILE_ATTRIBUTES) {
  CreateDirectory(newPath,NULL);
}

Обратите внимание, что функция вернет INVALID_FILE_ATTRIBUTES даже в случае сбоя по какой-либо другой причине, например, из-за отсутствия прав доступа к файлу, поэтому вам следует проверить возвращаемое значение CreateDirectory, чтобы убедиться, что оно успешно выполнено.

На самом деле вам не нужно проверять, существует ли каталог; CreateDirectory установит код ошибки, если каталог уже существует:

if (!CreateDirectory(newPath,NULL)) {
  if (GetLastError() == ERROR_ALREADY_EXISTS) {
    // directory already exists
  } else {
    // creation failed due to some other reason
  }
}
2 голосов
/ 05 июля 2016

Как насчет PathIsDirectory()?В исходном примере вы можете использовать PathRemoveFilespec(), а затем PathCombine(), чтобы добавить новое имя файла / расширение.В маловероятном случае, когда ваша цель - только Windows 8 или более поздняя версия, есть более безопасные PathCch...() варианты этих функций.

1 голос
/ 30 ноября 2010

Я использую PathFileExists.

0 голосов
/ 14 сентября 2012

Я должен отметить, что GetFileAttributes работает медленно, когда файл является сетевым путем. На самом деле, он работает медленно в первый раз, а потом быстро.

0 голосов
/ 26 ноября 2010

Вы можете использовать _accees или _waccess из среды выполнения C. Это страница msdn, и вы можете увидеть пример использования А также вам не нужно беспокоиться о том, существует ли каталог, потому что CreateDirectory проверяет и возвращает ERROR_ALREADY_EXISTS, если существует. Вы можете увидеть здесь (коды возврата).

0 голосов
/ 26 ноября 2010

FindFirstFile. Несмотря на «Файл» в названии, он найдет каталоги очень хорошо.

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