c ++ - 拆分绝对文件路径

时间:2016-02-20 22:51:28

标签: c++ split absolute-path chdir

我正在为学校作业编写C ++程序。在某些时候,这个问题要求我改变目录,我知道该怎么做。但是,用户将为程序提供文件的绝对路径。我想要做的是将目录更改为该文件所在的位置。例如,如果我在目录dir2中,并且用户想要转到该文件

     /home/dir1/dir2/dir3/dir4/file

我想做

     int ret = chdir("home/dir1/dir2/dir3/dir4");

我的问题是如何将用户指定的字符串拆分为

     /home/dir1/dir2/dir3/dir4/

     file

编辑我明白了。我首先将绝对路径名从const char *转换为字符串。然后我使用.find_last_of(" /")字符串成员来查找最后一个" /"的位置。在字符串中。然后我使用.substr()成员从0返回由.find_last_of返回的那个位置

5 个答案:

答案 0 :(得分:2)

只需获取文件路径中“/”字符的最后一个索引,然后使用字符串中的扩展名剪断文件。

1)检查目录列表是否有“/”。如果不是 - 抛出错误。

2)获取字符串中“/”的最后一个索引。

3)返回目录字符串的子字符串,使用函数结果的最后一个索引(一个数字)作为起始索引和目录字符串的总长度。

希望有所帮助。

答案 1 :(得分:2)

你可以使用

std::string dir_str = "path/file";
auto pos = dir_str.rfind("/");
if (pos!= std::string::npos) {
  chdir("newpath"+dir_str.substr(pos));
  //...
} else {
//do something;
}

文件名中可能存在字符/等问题。但假设这只是一个专为简单测试而设计的玩具程序,它应该可行。

如果你有点认真处理文件(比如递归遍历目录),我建议使用boost :: file_system之类的东西。

答案 2 :(得分:1)

您可以使用strtok中的<string.h>函数来拆分路径组件,并按顺序跟踪层次结构中的每个目录。

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="/path/to/file";
  char * pch;
  char * temp;
  pch = strtok (str,"/");
  while ( (temp = strtok (NULL, "/") ) != NULL)
  {
    pch = temp;
  }

  printf("The file is: %s", pch);
  return 0;
}

答案 3 :(得分:1)

将您的路径放入std::string然后您可以执行以下操作。

std::string path = "/home/person/dir/file";
std::size_t botDirPos = path.find_last_of("/");
// get directory
std::string dir = path.substr(0, botDirPos);
// get file
std::string file = path.substr(botDirPos, path.length());
// change directory.
chdir(dir.c_str());

答案 4 :(得分:0)

要添加大量答案,我在查找stat结构和函数后设计了此方法:


struct ab_path{
   int delimiter = 0;
   int extension = 0;
   int length    = 0;
   char separator = '\0'; 

   ab_path(){}
   operator bool()
   { return (this->delimiter != 0) | (this->extension != 0) | (this->length != 0) | (this->separator != '\0') ;}
};

bool ab_path( const char* name , struct ab_path* ap ){
   while(1){
      if(name[ap->length] == '\0'){break;}
      if(name[ap->length] == '.') {ap->extension = ap->length;}
      if(name[ap->length] == '/') 
          {ap->delimiter = ap->length; ap->separator = name[ap->length];}
      if(name[ap->length] == '\\') 
          {ap->delimiter = ap->length;ap->separator = name[ap->length];}
      ++ap->length;
   }
   return (bool)ap;
}

struct ab_path ap;
bool valid = ap_path("superb.naming.type", &ap );

但是您可以重写ap->delimiter以接受某种类型的容器(std::vectorstd::array ...)并存储多个定界符。