我以递归方式找到了很多CreatingDirectory的例子,但没有找到我想要的例子。
这是规范
给定输入
使用帮助程序API
CreateDirectory (char * path)
returns true, if successful
else
FALSE
条件:不应该进行任何解析来区分路径是本地路径还是服务器共享。
用C或C ++编写例程
答案 0 :(得分:6)
我认为这更容易......这里的版本适用于每个Windows版本:
unsigned int pos = 0;
do
{
pos = path.find_first_of("\\/", pos + 1);
CreateDirectory(path.substr(0, pos).c_str(), NULL);
} while (pos != std::string::npos);
的Unicode:
pos = path.find_first_of(L"\\/", pos + 1);
此致
答案 1 :(得分:2)
这可能正是您想要的。 它不会尝试进行任何解析来区分路径是本地还是服务器共享。
bool TryCreateDirectory(char *path){
char *p;
bool b;
if(
!(b=CreateDirectory(path))
&&
!(b=NULL==(p=strrchr(path, '\\')))
){
size_t i;
(p=strncpy((char *)malloc(1+i), path, i=p-path))[i]='\0';
b=TryCreateDirectory(p);
free(p);
b=b?CreateDirectory(path):false;
}
return b;
}
该算法非常简单,只需递归传递更高级别目录的字符串,同时创建当前级别的目录失败,直到一次成功或没有更高级别。当内部调用返回成功时,创建当前调用。此方法不解析为自己确定本地或服务器,它是根据CreateDirectory。 在WINAPI中,CreateDirectory永远不会允许您在路径达到该级别时创建“c:”或“\”,该方法很快就会以path =“”调用它自己,这也会失败。这就是为什么Microsoft定义这样的文件共享命名规则,以实现DOS路径规则的兼容性并简化编码工作。
答案 2 :(得分:1)
完全是hackish and unecure,而且在生产代码中你真的不想做任何事情,但是......
警告:此处是在浏览器中输入的代码:
int createDirectory(const char * path) {
char * buffer = malloc((strlen(path) + 10) * sizeof(char));
sprintf(buffer, "mkdir -p %s", path);
int result = system(buffer);
free(buffer);
return result;
}
答案 3 :(得分:1)
如何使用MakeSureDirectoryPathExists()?
答案 4 :(得分:0)
只需遍历从根开始的路径中的每个目录级别,尝试创建下一级别。
如果任何CreateDirectory调用失败,那么您可以提前退出,如果您到达路径的末尾而没有失败,那么您就会成功。
这假设在已存在的路径上调用CreateDirectory没有不良影响。
答案 5 :(得分:0)
不解析服务器名称的路径名的要求很有意思,因为它似乎承认需要解析/
。
也许这个想法是避免为主机和挂载点的潜在复杂语法构建hackish表达式,这可能会在某些系统上编写详细的凭据。
如果是家庭作业,我可能会放弃您应该想到的算法,但我发现满足这些要求的一种方法是尝试通过尝试mkdir完整路径名来开始尝试。如果失败,请删除 last 目录并再次尝试,如果失败,请删除另一个并再试一次...最终您应该到达根目录而不需要了解服务器语法,然后您将需要开始添加路径名组件并逐个创建子目录。
答案 6 :(得分:0)
std::pair<bool, unsigned long> CreateDirectory(std::basic_string<_TCHAR> path)
{
_ASSERT(!path.empty());
typedef std::basic_string<_TCHAR> tstring;
tstring::size_type pos = 0;
while ((pos = path.find_first_of(_T("\\/"), pos + 1)) != tstring::npos)
{
::CreateDirectory(path.substr(0, pos + 1).c_str(), nullptr);
}
if ((pos = path.find_first_of(_T("\\/"), path.length() - 1)) == tstring::npos)
{
path.append(_T("\\"));
}
::CreateDirectory(path.c_str(), nullptr);
return std::make_pair(
::GetFileAttributes(path.c_str()) != INVALID_FILE_ATTRIBUTES,
::GetLastError()
);
}
答案 7 :(得分:0)
void createFolders(const std::string &s, char delim) {
std::stringstream ss(s);
std::string item;
char combinedName[50]={'\0'};
while (std::getline(ss, item, delim)) {
sprintf(combinedName,"%s%s%c",combinedName,item.c_str(),delim);
cout<<combinedName<<endl;
struct stat st = {0};
if (stat(combinedName,&st)==-1)
{
#if REDHAT
mkdir(combinedName,0777);
#else
CreateDirectory(combinedName,NULL);
#endif
}
}
}