_splitpathついて

解決


とーご  2007-07-28 01:07:38  No: 65858

環境
VC++6.0
Windows2000PRO SP4
MFC

こんにちは、とーごと言います。
タイトルの_splitpathを使用してファイル名を取得する際
フルパスが名が
  「C:\ほげほげ表\ファイル1.txt」
のような時、ファイル名が
  「ほげほげ表ファイル1」
になってしまい、ファイル名を正規表現で
フィルタリングをする際の正規表現から外れてしまい上手く動作しません。
原因は文字コードの下位が5Cと言うのも判っています。
(上記は例です。実際には他の下位が5C文字がディレクトリの最終文字の時に
再現しています。)
ネット上では_splitpathなら楽にファイル名が引っ張ってこれるとの
情報しか検索の技術が拙いのも手伝い見つけることができませんでした。

ここからが本題なのですが、この現象は環境に影響されているのかが知りたいのと
今でもこの問題があるのならどういった対策をしているのかが知りたくて投稿させてもらいました。
VC++6.0もWindows2000PROSP4もずいぶんと年季が入ったものですので問題があるのかと思いまして。
WindowsXPやVC++.NET等では問題がないのでしょうか?
(どちらもまだ所持していないというのも問題なのも判ってはいるのですが)
良かったら教えていただけないでしょうか?


Blue  2007-07-28 01:27:14  No: 65859

プリプロセッサの定義に

_MBCS

はきちんと含まれていますか?

(VC++6.0 Enter SP6の)
SPLITPAT.Cを見る限り、2バイト文字を考慮しないルートを通るのは
_MBCSが定義されてい時のようなので。


とーご  2007-07-28 01:48:15  No: 65860

早速の返答ありがとうございます。

プリプロセッサの定義はVC++6.0では
プロジェクト→設定→C/C++のプリプロセッサの定義でよかったですよね?
そこでは定義しています。
プロジェクトオプションにも_MBCSは入っています。
間違っているでしょうか?


Blue  2007-07-28 01:52:07  No: 65861

デバッガで_splitpathの中は追えますか?

ちなみに私の環境でいくら_MBCSを消したり#undefしても

#ifdef _MBCS

のところはスキップしないです。
(おそらく、_splitpathをスタティックリンクしているからそうなんだろうな。)

ちなみに、まっさらなプロジェクトで
#include <stdlib.h>

int main(void)
{
    const char* path = "C:\\ほげほげ表\\ファイル1.txt";
    char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
    _splitpath(path, drive, dir, fname, ext);

    return 0;
}

とコードを書いても同じ結果になりますかね?


とーご  2007-07-28 02:05:37  No: 65862

サラなプロジェクトでやるとなりませんねorz
(自分で書いているコードを移植しても問題なし)
今使ってるプロジェクトファイルがどこかおかしくなっているのでしょうか?


とーご  2007-07-28 02:35:25  No: 65863

今追っていってるのですが、_splitpathに入る前になぜか
\が飛んでいるようです…
原因が_splitpathではないということが判りました orz
Blueさん、お手数お掛けしました。


とーご  2007-07-28 03:12:58  No: 65864

原因判明しました。
CFileFind::GetFilePath
が\飛ばしてくれてましたorz
CFileFind::GetFileNameは正常に動作しているようなので文字列自分で
再構成し、対応する事にしました。

これMFCのバグですよね コロコロo......rz


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加