Создание директории

Штука достаточно простая, большинство бы и так догадалось как делать, но иногда нужно просто держать сухим нужный кусок кода, вынуть его из заначки и применить.

Расскажу – как нужно делать.
Нужно воспользоваться API-шной функцией CreateDirectory. Функция – повторюсь, из WinAPI, в MFC ничего подобного нет. Несколько раз видел в ответ на скупой и лаконичный ответ “CreateDirectory” вопрос “Это у какого класса такой метод?”. Вопрос подобный повергает меня в смущение, но это уже оффтопик.

А теперь рассмотрим очень часто встречающуюся ситуацию, когда при создании директории “C:\\1\\2\\3\\4” в момент попытки создания не существует ни директории 1, ни 2, ни 3, ни 4. В общем – создать её в этом случае одним вызовом CreateDirectory() не удастся.
Тогда можно воспользоваться обещаным куском кода.

Данный код не привязан к Visual C++ или, например, lcc (на котором он и был написан), и вообще к С++ (на Дельфи ситуация будет выглядеть очень похоже, сдецл поменияется только синтаксис).



TCHAR   sPathTo [] = “c:\\1\\2\\3\\4\\5\\6\\7\\8”;//директория, которую нужно создать

bool AQLCreateDirectory(TCHAR * sPathTo)
{
  //пока директория не создана, будем пытаться её создать//
  while(CreateDirectory(sPathTo, NULL) == FALSE)
  {
    /* директория не создана, поэтому нужно сначала создать ”предыдущую” директорию */
    TCHAR   sTemp[MAX_PATH];
    int k = strlen(sPathTo);
    strcpy(sTemp, sPathTo);

    //пытаемся найти и создать директорию самого “нижнего” уровня
    while(CreateDirectory(sTemp, NULL) != TRUE)
    {
      /* пытаемся найти первичные половые признаки предыдущей директории.... */
      while(szTemp1[--k] != '\\')            
      {
        if(k<=1)                        
          return FALSE;/* похоже, что директория создана быть вообще не может! 
        sTemp[k] = NULL;
      }
      /* ......а как только нашли - создать её */     
    }
    //во время первого прохода будет создана директория “1”, во время второго – “2” и т.д.
  }
  return TRUE;
}



В общем, код достаточно простой, и ясен почти без комментариев.
Более того: его можно изменить. Например: разобрать один раз строку с исходным путём, и потом создать подряд все директории, начиная с первой (может уменьшиться время потраченое на разбор строки), но могу сказать, почему я этого не сделал. Если не хватает 1-ой 2-х директорий в самом конце пути (наиболее часто встречающаяся ситуация), то код будет работать не намного дольше, а может и вообще быстрее (если вложенность большая).

Причин, по которым директория не может быть создана может быть много, например - у пользователя не хватает прав. В этом случае код можно расширять и дополнять.
 
« Предыдущая статья   Следующая статья »