Мне нужен аналог c #
Directory.CreateDirectory("d:\\asd\\dsa\\123");
который создаст все эти каталоги, даже если диск D полностью пуст без каких-либо каталогов.
Я прочитал про WinApi CreateDirectory следующую вещь:
«ERROR_PATH_NOT_FOUND — один или несколько промежуточных каталогов не существуют; эта функция будет создавать только последний каталог в пути».
Так что это не то, что я ищу ..
Есть ли другие способы сделать то, что я хочу?
Вы пытались использовать mkdir()
функция? Еще один способ использования:
повысить файловую систему: поддерживает стандартный размер 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";
}
Функция SHCreateDirectoryEx для Win XP (SP2) и
Высшее. Однако он ограничен 247 символами, что меньше стандартного MAX_PATH (260), поддерживаемого другими функциями файловой системы Win32 API.
32,767
широкие символы, вызовите Unicode-версию функции и добавьте "\\?\"
префикс к пути. НОТА: Поскольку большинство операционных функций Boost.Filesystem просто передают содержимое объекта пути к классу в API Windows, они работают с префиксами расширенной длины. Но некоторые не будут работать из-за ограничений, наложенных Windows. — Повышение предупреждения.
Проверьте, предоставляет ли ваш конкретный поставщик компилятора собственную функцию RTL для этой цели. Например, Delphi / C ++ Builder имеет ForceDirectories()
функция доступна.
Ну, в 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);
};