编程求两个文件相对路径C++,该如何解决

编程求两个文件相对路径C++
如题: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 <<