Есть ли какая-либо функция в C или C ++ или WinApi для создания каталога, включая все несуществующие каталоги по указанному пути?

Мне нужен аналог c #

Directory.CreateDirectory("d:\\asd\\dsa\\123");

который создаст все эти каталоги, даже если диск D полностью пуст без каких-либо каталогов.

Я прочитал про WinApi CreateDirectory следующую вещь:
«ERROR_PATH_NOT_FOUND — один или несколько промежуточных каталогов не существуют; эта функция будет создавать только последний каталог в пути».
Так что это не то, что я ищу ..

Есть ли другие способы сделать то, что я хочу?

0

Решение

Вы пытались использовать mkdir() функция? Еще один способ использования:

  1. повысить файловую систему: поддерживает стандартный размер MAX_PATH 260.

    const char dir_path[] = "c:\\temp\\cplusplus";

    boost::filesystem::path dir(dir_path);
    if(boost::filesystem::create_directory(dir)) {
    std::cout << "Success" << "\n";
    }
    
  2. Функция SHCreateDirectoryEx для Win XP (SP2) и
    Высшее. Однако он ограничен 247 символами, что меньше стандартного MAX_PATH (260), поддерживаемого другими функциями файловой системы Win32 API.

  3. Функция CreateDirectory : ограничение размера строки по умолчанию для путей длиной 248 символов. Это ограничение связано с тем, как функция CreateDirectory анализирует пути. Расширить этот лимит до 32,767 широкие символы, вызовите Unicode-версию функции и добавьте "\\?\" префикс к пути.

НОТА: Поскольку большинство операционных функций Boost.Filesystem просто передают содержимое объекта пути к классу в API Windows, они работают с префиксами расширенной длины. Но некоторые не будут работать из-за ограничений, наложенных Windows. — Повышение предупреждения.

3

Другие решения

Проверьте, предоставляет ли ваш конкретный поставщик компилятора собственную функцию RTL для этой цели. Например, Delphi / C ++ Builder имеет ForceDirectories() функция доступна.

2

Ну, в Perl / Ruby / Bash вы бы,

    `/bin/mkdir -p $pathname` #perl
%x(/bin/mkdir -p #{pathname}) #ruby
/bin/mkdir -p $pathname #bash

Таким образом, вы могли бы вызвать систему,

    system("mkdir -p pathname");

Добавлено:

Ну, вы хотите разделить данный путь на части и сделать каждую часть. Достаточно легко сделать в C (изменить char * и char [] на std :: string, strcat на + = для c ++),

int MakeDir( char* pathname )
{
struct stat sbuf;
if( stat(pathname, &sbuf) < 0 )
{
mkdir(pathname,0); //set your permissions as you like in 2nd argument
return(0);
}
else //exists? skip
{
//stat.st_mode tells file or dir
if( S_ISDIR(stat.st_mode) ) { return(0); }
else if( S_ISREG(stat.st_mode) ) { return(-1); }
else if( S_ISFIFO(stat.st_mode) ) { return(-1); }
else if( S_LNK(stat.st_mode) ) { return(0); } //can link to dir
else { return(-1); }
}
return(0);
};
////char PATHSEP = "\/"; //unix/linux //not needed, just use 'mkdir -p'
char PATHSEP = "\\"; //windows
int MkdirPath( char *pathname )
{
char parts = strdup(pathname);
char buildpath[strlen(pathname)] = "";
char* part = strtok(parts,PATHSEP);
while ( part )
{
strcat(pathname, PATHSEP); strcat(pathname, part);
if( MakeDir( pathname ) < 0 ) { break; }
part = strtok(NULL,PATHSEP);
}
return(0);
};
0