絶望した! PathRemoveBackslash() に絶望したァ!!

取得したパスを他のプログラムに渡すべく、コマンドライン引数に渡す…という処理を書いたのです。 イメージ的にはこんな感じ。

# コマンドラインで書くとこんな感じ。
# スペース入ることがあるので "" で囲ってあげる
>foo.exe "%PathInfo%" "%bar_param%"

"" で括ったので、スペース含むパスが来ても問題ないかしらー! …と思ったのですが、動かないケースが。 調べてみると原因は、「PathInfo の最後に \ があるとダメ」でした…って、あぁなるほど。 終端のクオートがエスケープされちゃうんッスね。そりゃアカン。

# 終端に \ があると終端の"がエスケープされちゃって挙動がおかしくなる
#               ココ↓
>foo.exe "c:\kanaria\" "lovelove_cute"


んじゃぁ、無条件に最後の \ 削っちまえばいいよね! …と。 丁度その処理を行ってくれる WinAPI PathRemoveBackslash関数 が用意されていますね。

Removes the trailing backslash from a given path.
意訳:与えられたパスのバックスラッシュを削除する程度の能力。

Returns the address of the NULL that replaced the backslash, or the address of the last character if it's not a backslash.
意訳:NULL値を指すアドレス返したら、しかたねーからバックスラッシュ削除してやったってこった。感謝しろよ。 最後の文字のアドレス返したら、それバックスラッシュじゃねーから。死ねよ。糞ビッチが。

というわけで PathInfo を PathRemoveBackslash() に投げて最後の \ を削除するコードに変更。そして実行!









\うごかねぇ/

正確に言うと、動いたり動かなかったり…ええええ、どないして ('A`)

色々検証したところ、こんな事実が発覚。

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR szBuff[MAX_PATH] = TEXT("c:\\");

    LPTSTR ret = ::PathRemoveBackslash(szBuff);
    _puttchar(*ret);

    getchar();
    return 0;
}

// 出力結果
\

てめぇ! 「it's not a backslash.」じゃねーじゃねーか!

というわけで、c:\windows\ とかディレクトリの後ろに付いてる \ は削られますが、ドライブレター直下の \ ってのは削られない様子です。"c:" じゃなくて "c:\" が正式なんですかね…



………にょろーん