поиск и устранение неисправностей _mkdir - PullRequest
2 голосов
/ 30 июня 2011
#include <iostream>
#include <direct.h>
using namespace std;
int main() {
 if( _mkdir("d:\\a\\b") == 0 ){
   cout << "success";
 }    else if (  _mkdir("d:\\a") == EEXIST ) {
   cout << "Directory was not created because dirname is the name of an existing   file, directory, or device.";
      }
         else if (  _mkdir("d:\\a") == ENOENT ) {
      cout << "Path was not found.";
    }
}

При запуске программы вывод неожиданный. (В большинстве случаев это сбой. Я не знаю причину)

иногда я вижу успех. Много раз я, если я удаляю двойную косую черту \\ с одной косой чертой \, сообщение является успешным. Это меня бесит. Почему это происходит ? backslashes проблема?

UPDATE

в Visual C ++ 2010 Express Edition, когда я нажимаю CTRL + F5 вывод только нажмите любую клавишу, чтобы продолжить ...

Ответы [ 4 ]

6 голосов
/ 30 июня 2011

Двойная косая черта правильная.Проверьте номер ошибки , чтобы выяснить причину сбоя:

Каждая из этих функций возвращает значение 0, если был создан новый каталог.При ошибке функция возвращает -1 и устанавливает значение errno следующим образом:
EEXIST - Каталог не был создан, поскольку dirname - это имя существующего файла, каталога или устройства.ENOENT - путь не найден.

Обратите внимание, что:

_mkdir может создать только один новый каталог за вызов, поэтому только последний компонент dirname может назвать новый каталог.

Вероятные причины:

  • вы пытаетесь создать и a, и b с одним и тем же вызовом (используйте, например, SHCreateDirectoryEx()вместо)
  • каталог уже существует
4 голосов
/ 30 июня 2011

Вы были довольно расплывчаты относительно того, что не удается означает в вашем случае. Может ли это быть связано с тем, что вы пытаетесь создать несколько папок одновременно?

Вы можете создать папку d:\a\b, только если d:\a уже существует. В противном случае вам нужно сначала создать d:\a, а затем создать d:\a\b.

Вот код, который я написал , чтобы правильно создать каталог любой глубины.

1 голос
/ 30 июня 2011

Обратите внимание, что _mkdir не возвращает ENOENT или EEXIST, это значения errno после вызова _mkdir.Если _mkdir завершится неудачно, он всегда вернет -1 в соответствии с документацией.

http://msdn.microsoft.com/en-us/library/2fkk4dzw(v=vs.80).aspx

0 голосов
/ 23 июня 2013

Я тоже получил эту ошибку. В моем случае _mkdir() фактически возвращал 13 : EACCESS. Я не могу точно сказать, почему, но изменение разделителя с '\\' на '/' фактически решило мою проблему. Согласно этой теме , поведение mkdir() определяется платформой, и в моем случае я использую VC++2012 в Windows 7.

Обновление: проблема не в разделителе. Чтобы создать папку, я рекурсивно пытаюсь создать ее родителей, проверяя результат _mkdir(). Для создания C:\1\2 Сначала я пытаюсь создать C:, который не только уже существует, но и разрешение на его создание не предоставляется. Кажется, что разрешение на создание папки проверяется перед фактической проверкой, если она существует! Вот почему я получаю EACCESS.

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