我正在为学校作业编写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返回的那个位置
答案 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::vector
,std::array
...)并存储多个定界符。