プロが教えるわが家の防犯対策術!

フルパスのファイル名を参照し、フォルダが無ければ作成するというプログラムを作成したいのですが、漢字も混在していて、その第2コードが0x5c(\)の場合もあるため、正常に動作しません。
言語 VisualC++6.0

ファイル名(pszPath) c:\test\売上実績表\10月実績表.xls

void CFTWnd::MakePath(char* pszPath)
{
WIN32_FIND_DATA find;
HANDLE h;
char szTmp[_MAX_PATH];
UINT nLen;
UINTi;

ZeroMemory(szTmp, _MAX_PATH);
nLen = strlen(pszPath);

szTmp[0] = pszPath[0];
szTmp[1] = pszPath[1];
szTmp[2] = pszPath[2];
for( i = 3; i < nLen; i++ )
{
if( pszPath[i] != '\\' )
{
szTmp[i] = pszPath[i];
}
else
{
if( (h = FindFirstFile(szTmp, &find)) != INVALID_HANDLE_VALUE )
{
FindClose(h);
}
else
{
_mkdir(szTmp);
}
szTmp[i] = pszPath[i];
}
}
}

「表」の第2コードが0x5c(\)という事もあり、余計なフォルダが作成されてしまいます。
何か良い方法があったら教えて下さい。
よろしくお願いします。

A 回答 (6件)

//サンプルパス


char szFullPath[] = "C:\\hoge\\表1.csv";

char szDrive[MAX_PATH], szPath[MAX_PATH], szFile[MAX_PATH], szExt[MAX_PATH];
::_splitpath(
szFullPath,
szDrive,
szPath,
szFile,
szExt
);

//パス
char szPathName[MAX_PATH];
strcpy(szPathName, strcat(szDrive, szPath));

//ファイル名
char szFileName[MAX_PATH];
strcpy(szFileName, strcat(szFile, szExt));

MakeSureDirectoryPathExists(szPathName);
(以下略)
とかね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
現在、charmer29-2さんへのお礼に述べたようなエラーが発生しています。厚かましいお願いですが、何か助言を頂けないでしょうか。
よろしくお願いします。

お礼日時:2006/12/05 10:29

#4,#5です


ゴメンナサイ、よく読んでませんでした。
当然やってますよねorz

で、改めて。
OSは何をお使いでしょうか。
    • good
    • 1
この回答へのお礼

imagehlp.libをリンクしてませんでした。(デバッグモードでは、インクルードしただけで、正常動作してましたので...)

#pragma comment(lib, "imagehlp.lib")
をソースに追加し、リンクエラーも解消されました。

ほんとうにありがとうございました!!
(ちなみに、OSはXpProです。)

お礼日時:2006/12/05 13:45

imagehlp.libをリンクして


imagehlp.hをインクルードしていますか?

#pragma comment(lib, "imagehlp.lib")
#include "imagehlp.h"
    • good
    • 0

つ[MakeSureDirectoryPathExists()]


APIを使っていいようですし、これ一発で全て終わる気がします。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。回答ありがとうございます。
以下のように変更し、デバッグモードでうまく動作したのでリリースモードでリビルドしたら、リンクエラーが発生しました。
何分、VC++は始めたばかりで、よく分かりません。厚かましいお願いですが、何か助言を頂けないでしょうか。

ファイル名(pszPath) c:\test\売上実績表\10月実績表.xls

#include "imagehlp.h"

void CFTWnd::MakePath(char* pszPath)
{
WIN32_FIND_DATA find;
HANDLE h;
char szTmp[_MAX_PATH];

_splitpath(pszPath, szDrive, szDir, szFname, szExt);
strcpy(szTmp, szDrive);
strcat(szTmp, szDir);

if( (h = FindFirstFile(szTmp, &find)) != INVALID_HANDLE_VALUE )
{
FindClose(h);
}
else
{
MakeSureDirectoryPathExists(szTmp);
}
}

【エラー内容】
リンク中...
FTWnd.obj : error LNK2001: 外部シンボル "__imp__MakeSureDirectoryPathExist@4"は未解決です
.\Release/Nbft.exe : fatal error LNK1120: 外部参照1が未解決です。
link.exeの実行エラー

以上、よろしくお願いします。

お礼日時:2006/12/05 10:26

・マルチバイト文字の判定


CharNext系のAPIを使うと便利ですよ。
    • good
    • 0
この回答へのお礼

遅くなりましたが、回答頂き、ありがとうございました。
結局、『MakeSureDirectoryPathExists』を使って解決しました。

お礼日時:2006/12/06 15:27

マルチバイト文字であると判定された場合は、次の'文字'を


比較するようにすればいいだけではないかと思います。
    • good
    • 0
この回答へのお礼

遅くなりましたが、回答頂き、ありがとうございました。
結局、『MakeSureDirectoryPathExists』を使って解決しました。

お礼日時:2006/12/06 15:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!