Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Как создать каталог


Необходимо воспользоваться 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-х директорий в самом конце пути (наиболее часто встречающаяся ситуация), то код будет работать не намного дольше, а может и вообще быстрее (если вложенность большая).

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

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS