递归CreateDirectory

时间:2009-10-04 23:14:53

标签: c recursion share

我以递归方式找到了很多CreatingDirectory的例子,但没有找到我想要的例子。

这是规范

给定输入

  1. \\服务器\共享\ AA \ BB \ CC
  2. C:\ AA \ BB \ CC
  3. 使用帮助程序API

     CreateDirectory (char * path)
     returns true, if successful
     else
     FALSE
    

    条件:不应该进行任何解析来区分路径是本地路径还是服务器共享。

    用C或C ++编写例程

8 个答案:

答案 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
    }
 }
}