Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C]Создание цепочки директорий


Автор: En_t_end 3.7.2007, 18:01
Код

void create_dirs(char* full_path,unsigned int path_len) //caution!!!
{
    for(unsigned int n=0;n<path_len+1;)
    {
        unsigned int i;
        for(;i<path_len+1 && full_path[i] != SLASH;i++);
        if(i!=path_len+1) full_path[i] = '\0';
        MKDIR(full_path);
        if(i!=path_len+1) full_path[i] = SLASH;
        n = i+1;
    }
}

Как вариант создает цепочку всех промежуточных директорий.
Не устраивает собственно тупость своего кода, ибо требовать в данном случае non-const для пути к последней директории - есть зло. Конечно, можно и в случае non-const сделать используя strtok, но это меня не устраивает уже по двум причинам, вторая:
Код

Each function uses a static variable for parsing the string into tokens
MSDN

Да если честно мой способ тоже грешен подчти этим же но косвенно. Если указатель будет указывать на данные, паралельно обратывающиеся ещё где-то, то придется создавать копию данных. А этого я как раз хотел избежать, ибо понятно, что можно тем же кодом пользоваться просто создавая у себя копию данных.

Добавлено @ 18:02
Короче опять задача из разряда "и рыбку съесть и на елку сесть" :(

Автор: Koshibot 3.7.2007, 18:09
ваааагх чел используй strtok

Автор: JackYF 3.7.2007, 18:19
Цитата(Koshibot @  3.7.2007,  18:09 Найти цитируемый пост)
ваааагх чел используй strtok 

мдя, смотри название и подпись к теме

хм, задача абсолютно логичная... мой вариант: используй последовательный поиск слэшей (что ты и делаешь) + strcat'ом накапливай новую строку, содежащую текущую несозданную директорию. Не самый лучший вариант, надо бы еще подумать.

Автор: En_t_end 3.7.2007, 18:22
Цитата(JackYF @  3.7.2007,  22:19 Найти цитируемый пост)
 strcat'ом накапливай новую строку

опять же придется выделять память :(

Автор: JackYF 3.7.2007, 18:35
Цитата(En_t_end @  3.7.2007,  18:22 Найти цитируемый пост)
опять же придется выделять память :(

та да, но фукнции а-ля mkdir требуют же null-terminated параметр, я так понимаю? или изменять переданную строку (что, имхо, хуже), либо создавать что-то новое.

Кстати, а неужели здесь производительность настолько критична? неужели на целевой системе создаются громады вложенных директорий? имхо, пусть будет чуть медленный, зато c большей претензией на thread-safe, да и параметры константные останутся.

Автор: En_t_end 3.7.2007, 18:44
Цитата(JackYF @  3.7.2007,  22:35 Найти цитируемый пост)
та да, но фукнции а-ля mkdir требуют же null-terminated параметр, я так понимаю? или изменять переданную строку (что, имхо, хуже), либо создавать что-то новое.

да нужна null-terminated строка.
Цитата(JackYF @  3.7.2007,  22:35 Найти цитируемый пост)
Кстати, а неужели здесь производительность настолько критична?

я не знаю smile просто хочется максимальной эффективности.
Цитата(JackYF @  3.7.2007,  22:35 Найти цитируемый пост)
мхо, пусть будет чуть медленный, зато c большей претензией на thread-safe, да и параметры константные останутся.

придется так и сделать :(.

Автор: likehood 3.7.2007, 20:12
Проще всего создать копию исходной строки. Тогда алгоритм даже менять не придется.

Автор: En_t_end 3.7.2007, 20:21
Цитата(likehood @  4.7.2007,  00:12 Найти цитируемый пост)
Проще всего создать копию исходной строки. Тогда алгоритм даже менять не придется.

Цитата(En_t_end @  3.7.2007,  22:01 Найти цитируемый пост)
А этого я как раз хотел избежать, ибо понятно, что можно тем же кодом пользоваться просто создавая у себя копию данных.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)