環境
VC++6.0
Windows2000PRO SP4
MFC
こんにちは、とーごと言います。
タイトルの_splitpathを使用してファイル名を取得する際
フルパスが名が
「C:\ほげほげ表\ファイル1.txt」
のような時、ファイル名が
「ほげほげ表ファイル1」
になってしまい、ファイル名を正規表現で
フィルタリングをする際の正規表現から外れてしまい上手く動作しません。
原因は文字コードの下位が5Cと言うのも判っています。
(上記は例です。実際には他の下位が5C文字がディレクトリの最終文字の時に
再現しています。)
ネット上では_splitpathなら楽にファイル名が引っ張ってこれるとの
情報しか検索の技術が拙いのも手伝い見つけることができませんでした。
ここからが本題なのですが、この現象は環境に影響されているのかが知りたいのと
今でもこの問題があるのならどういった対策をしているのかが知りたくて投稿させてもらいました。
VC++6.0もWindows2000PROSP4もずいぶんと年季が入ったものですので問題があるのかと思いまして。
WindowsXPやVC++.NET等では問題がないのでしょうか?
(どちらもまだ所持していないというのも問題なのも判ってはいるのですが)
良かったら教えていただけないでしょうか?
プリプロセッサの定義に
_MBCS
はきちんと含まれていますか?
(VC++6.0 Enter SP6の)
SPLITPAT.Cを見る限り、2バイト文字を考慮しないルートを通るのは
_MBCSが定義されてい時のようなので。
早速の返答ありがとうございます。
プリプロセッサの定義はVC++6.0では
プロジェクト→設定→C/C++のプリプロセッサの定義でよかったですよね?
そこでは定義しています。
プロジェクトオプションにも_MBCSは入っています。
間違っているでしょうか?
デバッガで_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;
}
とコードを書いても同じ結果になりますかね?
サラなプロジェクトでやるとなりませんねorz
(自分で書いているコードを移植しても問題なし)
今使ってるプロジェクトファイルがどこかおかしくなっているのでしょうか?
今追っていってるのですが、_splitpathに入る前になぜか
\が飛んでいるようです…
原因が_splitpathではないということが判りました orz
Blueさん、お手数お掛けしました。
原因判明しました。
CFileFind::GetFilePath
が\飛ばしてくれてましたorz
CFileFind::GetFileNameは正常に動作しているようなので文字列自分で
再構成し、対応する事にしました。
これMFCのバグですよね コロコロo......rz
ツイート | ![]() |