C或C++或WinApi中是否有任何功能来创建目录,包括指定路径中所有不存在的目录

Are there any function in C or C++ or WinApi to create directory including all unexistent directories in specified path?

本文关键字:路径 不存在 包括指 是否 WinApi C++ 任何 功能 创建目录      更新时间:2023-10-16

我需要 c# 的模拟

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

这将创建所有这些目录,即使磁盘 D 完全为空,没有任何目录。

接下来我读了WinApi CreateDirectory:
"ERROR_PATH_NOT_FOUND - 一个或多个中间目录不存在;此函数只会在路径中创建最终目录。所以这不是我想要的。

还有其他方法可以做我想做的事吗?

您是否尝试使用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 个字符,这小于其他 Win32 API 文件系统函数支持的标准MAX_PATH (260)

  3. 创建目录函数:路径的默认字符串大小限制为 248 个字符。此限制与 CreateDirectory 函数解析路径的方式有关。若要将此限制扩展到宽字符32,767,请调用函数的 Unicode 版本,并在路径前面附加"\?"前缀。

注意: 由于大多数 Boost.Filesystem 操作函数只是将类路径对象的内容传递给 Windows API,因此它们确实使用扩展长度的前缀。但是有些不起作用,因为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,对于 c++,strcat 更改为 +=),

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);
};