取得したパスを他のプログラムに渡すべく、コマンドライン引数に渡す…という処理を書いたのです。 イメージ的にはこんな感じ。
# コマンドラインで書くとこんな感じ。 # スペース入ることがあるので "" で囲ってあげる >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:\" が正式なんですかね…
………にょろーん…