编程求两个文件相对路径C++,该如何解决
编程求两个文件相对路径C++
如题:linux下,已知两个文件存放目录(不是路径字符串),编写程序求两个文件的相对路径,说下思路也可以,多谢了!!!
------解决思路----------------------
是求两个文件互相的相对路径吗?
主要还是计算路径的公共前缀,,
去掉公共前缀后,把自己剩下的路径部分转换为../,对方的保持
------解决思路----------------------
/home/a/b/c/filea
/home/a/fileb
../../fileb
./b/c/filea
------解决思路----------------------
如题:linux下,已知两个文件存放目录(不是路径字符串),编写程序求两个文件的相对路径,说下思路也可以,多谢了!!!
------解决思路----------------------
是求两个文件互相的相对路径吗?
主要还是计算路径的公共前缀,,
去掉公共前缀后,把自己剩下的路径部分转换为../,对方的保持
------解决思路----------------------
/home/a/b/c/filea
/home/a/fileb
../../fileb
./b/c/filea
------解决思路----------------------
#include <limits.h>
#include <libgen.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
namespace {
bool CalcAbsPathAndType(const std::string& path, std::string* abs_path, bool* is_dir) {
struct stat st;
if (stat(path.c_str(), &st) == -1) return false;
*is_dir = S_ISDIR(st.st_mode);
// The mutable_path may be modified by dirname, so call basename first.
std::string mutable_path = path;
char* base_name = basename(&mutable_path[0]);
char* dir_name = *is_dir ? &mutable_path[0] : dirname(&mutable_path[0]);
char cur_dir[PATH_MAX];
if (!getcwd(cur_dir, sizeof(cur_dir))) return false;
if (chdir(dir_name) == -1) return false;
char abs_dir[PATH_MAX];
if (!getcwd(abs_dir, sizeof(abs_dir))) {
chdir(cur_dir);
return false;
}
abs_path->assign(abs_dir);
if (!*is_dir)
abs_path->append("/").append(base_name);
chdir(cur_dir);
return true;
}
void SeperateDirectory(const std::string& abs_path, std::vector<std::string> *dirs) {
size_t dir_beg = 1;
for (size_t dir_end = 1; dir_end <= abs_path.size(); ++dir_end) {
if ((dir_end - dir_beg) && (abs_path[dir_end] == '/'
------解决思路----------------------
abs_path[dir_end] == '\0')) {
dirs->push_back(abs_path.substr(dir_beg, dir_end - dir_beg));
dir_beg = dir_end + 1;
}
}
}
// NOTICE: only work for path of directory
bool CalcRelativePath(const std::string& from, const std::string& to, std::string* relative_path) {
std::string from_abs_path, to_abs_path;
bool from_is_dir, to_is_dir;
if (!CalcAbsPathAndType(from, &from_abs_path, &from_is_dir)
------解决思路----------------------
!CalcAbsPathAndType(to, &to_abs_path, &to_is_dir)
------解决思路----------------------
!from_is_dir
------解决思路----------------------
!to_is_dir) {
return false;
}
std::vector<std::string> from_dirs, to_dirs;
SeperateDirectory(from_abs_path, &from_dirs);
SeperateDirectory(to_abs_path, &to_dirs);
size_t min_size = std::min(from_dirs.size(), to_dirs.size());
size_t same_size = 0;
for (size_t i = 0; i < min_size; ++i) {
if (from_dirs[i] != to_dirs[i])
break;
++same_size;
}
relative_path->clear();
for (size_t i = same_size; i < from_dirs.size(); ++i)
relative_path->append("../");
for (size_t i = same_size; i < to_dirs.size(); ++i)
relative_path->append(to_dirs[i]).append("/");
if (!relative_path->size())
relative_path->assign(".");
return true;
}
}
int main(int argc, char** argv) {
if (argc < 3) {
std::cerr << "./main from_dir to_dir" << std::endl;
return 1;
}
std::string from(argv[1]);
std::string to(argv[2]);
std::string relative_path;
if (CalcRelativePath(from, to, &relative_path)) {
// run command to check: ./main
------解决思路----------------------
sh -x # (run in subprocess)
std::cout << "cd " << from << "; cd " << relative_path <<