Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C或C+中是否有任何函数+;或WinApi创建包含指定路径中所有不存在目录的目录?_C++_C_Winapi_Directory_Creation - Fatal编程技术网

C++ C或C+中是否有任何函数+;或WinApi创建包含指定路径中所有不存在目录的目录?

C++ C或C+中是否有任何函数+;或WinApi创建包含指定路径中所有不存在目录的目录?,c++,c,winapi,directory,creation,C++,C,Winapi,Directory,Creation,我需要一个模拟的c# 这将创建所有目录,即使磁盘D完全为空,没有任何目录 接下来我读了关于WinApi CreateDirectory的内容: “找不到路径错误-一个或多个中间目录不存在;此函数将仅在路径中创建最终目录。” 所以这不是我想要的 有没有其他方法可以实现我想要的功能?您是否尝试使用mkdir()函数?另一种使用方法: :支持标准最大路径大小260 const char dir_path[]=“c:\\temp\\cplusplus” boost::filesystem::path d

我需要一个模拟的c#

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

接下来我读了关于WinApi CreateDirectory的内容:
“找不到路径错误-一个或多个中间目录不存在;此函数将仅在路径中创建最终目录。”
所以这不是我想要的


有没有其他方法可以实现我想要的功能?

您是否尝试使用
mkdir()
函数?另一种使用方法:

  • :支持标准最大路径大小260

    const char dir_path[]=“c:\\temp\\cplusplus”

    boost::filesystem::path dir(dir\u path);
    if(boost::filesystem::create_目录(dir)){
    
    std::cout是否尝试使用
    mkdir()
    函数?另一种使用方法:

  • :支持标准最大路径大小260

    const char dir\u path[]=“c:\\temp\\cplusplus”

    boost::filesystem::path dir(dir\u path);
    if(boost::filesystem::create_目录(dir)){
    
    std::cout那么,在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)
    {
    结构统计sbuf;
    if(stat(路径名和sbuf)<0)
    {
    mkdir(路径名,0);//在第二个参数中根据需要设置权限
    返回(0);
    }
    否则//存在?跳过
    {
    //stat.st_模式告诉文件或目录
    if(S_ISDIR(stat.st_mode)){return(0);}
    else如果(S_ISREG(stat.st_mode)){return(-1);}
    else如果(S_ISFIFO(stat.st_模式)){return(-1);}
    否则如果(S_LNK(stat.st_mode)){return(0);}//可以链接到dir
    else{return(-1);}
    }
    返回(0);
    };
    ////char PATHSEP=“\/”;//unix/linux//不需要,只需使用“mkdir-p”
    char PATHSEP=“\\”;//窗口
    int MkdirPath(字符*路径名)
    {
    char parts=strdup(路径名);
    char buildpath[strlen(路径名)]=“”;
    char*part=strtok(parts,PATHSEP);
    while(部分)
    {
    strcat(路径名,路径sep);strcat(路径名,部分);
    if(MakeDir(路径名)<0){break;}
    part=strtok(NULL,PATHSEP);
    }
    返回(0);
    };
    
    在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)
    {
    结构统计sbuf;
    if(stat(路径名和sbuf)<0)
    {
    mkdir(路径名,0);//在第二个参数中根据需要设置权限
    返回(0);
    }
    否则//存在?跳过
    {
    //stat.st_模式告诉文件或目录
    if(S_ISDIR(stat.st_mode)){return(0);}
    else如果(S_ISREG(stat.st_mode)){return(-1);}
    else如果(S_ISFIFO(stat.st_模式)){return(-1);}
    否则如果(S_LNK(stat.st_mode)){return(0);}//可以链接到dir
    else{return(-1);}
    }
    返回(0);
    };
    ////char PATHSEP=“\/”;//unix/linux//不需要,只需使用“mkdir-p”
    char PATHSEP=“\\”;//窗口
    int MkdirPath(字符*路径名)
    {
    char parts=strdup(路径名);
    char buildpath[strlen(路径名)]=“”;
    char*part=strtok(parts,PATHSEP);
    while(部分)
    {
    strcat(路径名,路径sep);strcat(路径名,部分);
    if(MakeDir(路径名)<0){break;}
    part=strtok(NULL,PATHSEP);
    }
    返回(0);
    };
    
    检查您的特定编译器供应商是否为此提供了自己的RTL函数。例如,Delphi/C++Builder有一个可用的
    forceDirectory()
    函数。

    检查您的特定编译器供应商是否为此提供了自己的RTL函数。例如,Delphi/C++Builder有一个
    forceDirectory()
    功能可用。

    SHCreateDirectoryEx
    被限制为最大长度为247个字符的路径。boost文件系统被限制为260个字符的路径,除非提供了扩展长度前缀
    \\?\
    “\\\?\\c:\\temp\\cplusplus”
    )。某些分解其参数的boost文件系统函数仍限制为260个字符。如果需要长路径,则必须使用。奇怪的是
    SHCreateDirectoryEx()
    限制为247个字符,这比标准的
    MAX_PATH
    (260)要少其他Win32 API文件系统函数支持。感谢2个值得注意的地方:1:<代码> MKDIr < /C> >从VisualStudio 2005开始。表示了一个ISO C++兼容实现,但可以只创建一个新的目录。无长度限制。再次感谢您更新答案。虽然您直接从boost文档中复制了注释,但这显然是错误的。限制因素是boost,而不是Windows。boost页面上的部分继续解释了错误,但没有强调这是boost,而不是Windows API或文件系统。它是ven在这方面的说法是错误的。总的来说,我认为boost文件系统是一个特别低质量的boost贡献。
    SHCreateDirectoryEx
    仅限于最大长度为247个字符的路径。boost文件系统仅限于260个字符的路径,除非提供了扩展长度前缀
    \\?\
    “\\\?\\c:\\temp\\cplusplus”
    )某些分解其参数的boost文件系统函数仍然限制在260个字符以内。如果需要长路径,则必须使用创建的
    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);
    };