閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

フォルダ (ディレクトリ) のパスが入ってる文字列の階層を操作したい時は、一旦相対パスにするといい (かも)

たとえば "C:/hoge/foo/bar" みたいな文字列の内容を、 "C:/hoge/foo" にしたい、みたいな。下の階層のフォルダを示す場合は末尾に追加するだけでいいので何も考える必要はないのですが、上の階層に移動するとなるととたんに文字列操作が面倒くさくなります。これを文字検索だのなんだのをせずに楽にできないものか。

もしかしたらあるのかもしれないけれど、そういうことをしてくれる API とかが見つからなかったので、以下のようなことをやって実現してみました。

#include 
#include 
using namespace std;
nt main() {
  char szSrc[_MAX_PATH] = "C:\\hoge\\foo\\bar\\";
  // ↑ を "C:/hoge/foo" にしたい

  // C:/hoge/foo は 1 個上の階層にあるフォルダなので "../" を追加する
  ::strcat(szSrc, "..\\");

  char szDst[_MAX_PATH] = {0};
  ::_fullpath(szDst, szSrc, _MAX_PATH);

  cout << szDst << endl; //> "C:\hoge\foo\" が出力される
}

相対パスから絶対パスに変換する時、元のパスが "C:/hoge/foo/bar/../" みたいなものでもちゃんと変換してくれるようなので、それを利用してみました。色々なフォルダに相対パスを使って移動できるので結構便利かもしれない。