Как я могу создать дерево каталогов в C ++ / Linux? - PullRequest
95 голосов
/ 23 марта 2009

Я хочу простой способ создания нескольких каталогов в C ++ / Linux.

Например, я хочу сохранить файл lola.file в каталоге:

/tmp/a/b/c

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

Ответы [ 15 ]

2 голосов
/ 29 января 2014

Я знаю, что это старый вопрос, но он показывается высоко в результатах поиска Google, и ответы, представленные здесь, на самом деле не на C ++ или слишком сложны.

Обратите внимание, что в моем примере createDirTree () очень прост, потому что вся тяжелая работа (проверка ошибок, проверка пути) должна выполняться в любом случае createDir (). Также createDir () должен возвращать true, если каталог уже существует, или все это не будет работать.

Вот как бы я это сделал в C ++:

#include <iostream>
#include <string>

bool createDir(const std::string dir)
{
    std::cout << "Make sure dir is a valid path, it does not exist and create it: "
              << dir << std::endl;
    return true;
}

bool createDirTree(const std::string full_path)
{
    size_t pos = 0;
    bool ret_val = true;

    while(ret_val == true && pos != std::string::npos)
    {
        pos = full_path.find('/', pos + 1);
        ret_val = createDir(full_path.substr(0, pos));
    }

    return ret_val;
}

int main()
{
    createDirTree("/tmp/a/b/c");
    return 0;
}

Конечно, функция createDir () будет зависеть от системы, и в других ответах уже достаточно примеров, как написать ее для linux, поэтому я решил ее пропустить.

2 голосов
/ 12 декабря 2012

Поскольку этот пост занимает высокое место в Google как «Создать дерево каталогов», я собираюсь опубликовать ответ, который будет работать для Windows - он будет работать с использованием Win32 API, скомпилированного для UNICODE или MBCS. Это перенесено из кода Марка выше.

Так как это Windows, с которой мы работаем, разделители каталогов - это BACK-слэши, а не прямые. Если вы предпочитаете использовать косую черту, измените значение '\\' на '/'

Будет работать с:

c:\foo\bar\hello\world

и

c:\foo\bar\hellp\world\

(т. Е. Не требуется конечная косая черта, поэтому вам не нужно проверять ее.)

Прежде чем сказать «Просто используйте SHCreateDirectoryEx () в Windows», обратите внимание, что SHCreateDirectoryEx () устарела и может быть удалена в любое время из будущих версий Windows.

bool CreateDirectoryTree(LPCTSTR szPathTree, LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL){
    bool bSuccess = false;
    const BOOL bCD = CreateDirectory(szPathTree, lpSecurityAttributes);
    DWORD dwLastError = 0;
    if(!bCD){
        dwLastError = GetLastError();
    }else{
        return true;
    }
    switch(dwLastError){
        case ERROR_ALREADY_EXISTS:
            bSuccess = true;
            break;
        case ERROR_PATH_NOT_FOUND:
            {
                TCHAR szPrev[MAX_PATH] = {0};
                LPCTSTR szLast = _tcsrchr(szPathTree,'\\');
                _tcsnccpy(szPrev,szPathTree,(int)(szLast-szPathTree));
                if(CreateDirectoryTree(szPrev,lpSecurityAttributes)){
                    bSuccess = CreateDirectory(szPathTree,lpSecurityAttributes)!=0;
                    if(!bSuccess){
                        bSuccess = (GetLastError()==ERROR_ALREADY_EXISTS);
                    }
                }else{
                    bSuccess = false;
                }
            }
            break;
        default:
            bSuccess = false;
            break;
    }

    return bSuccess;
}
1 голос
/ 08 декабря 2016

Если dir не существует, создайте его:

boost::filesystem::create_directories(boost::filesystem::path(output_file).parent_path().string().c_str()); 
0 голосов
/ 23 марта 2009

Остальные дали вам правильный ответ, но я подумал, что продемонстрирую еще одну полезную вещь, которую вы можете сделать:

mkdir -p /tmp/a/{b,c}/d

Создает следующие пути:

/tmp/a/b/d
/tmp/a/c/d

Скобки позволяют вам создавать несколько каталогов одновременно на одном уровне иерархии, тогда как опция -p означает «создавать родительские каталоги по мере необходимости».

0 голосов
/ 23 марта 2009
mkdir -p /dir/to/the/file

touch /dir/to/the/file/thefile.ending
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...