C++ C或C+中是否有任何函数+;或WinApi创建包含指定路径中所有不存在目录的目录?
我需要一个模拟的c# 这将创建所有目录,即使磁盘D完全为空,没有任何目录 接下来我读了关于WinApi CreateDirectory的内容: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
“找不到路径错误-一个或多个中间目录不存在;此函数将仅在路径中创建最终目录。”
所以这不是我想要的
有没有其他方法可以实现我想要的功能?您是否尝试使用
mkdir()
函数?另一种使用方法:
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);
};