• ベストアンサー

フルパスのファイル名からフォルダを作成したい。

フルパスのファイル名を参照し、フォルダが無ければ作成するというプログラムを作成したいのですが、漢字も混在していて、その第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; UINT i; 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(\)という事もあり、余計なフォルダが作成されてしまいます。 何か良い方法があったら教えて下さい。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • FAY
  • ベストアンサー率49% (95/193)
回答No.4

//サンプルパス 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); (以下略) とかね。

taka077
質問者

お礼

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

その他の回答 (5)

  • FAY
  • ベストアンサー率49% (95/193)
回答No.6

#4,#5です ゴメンナサイ、よく読んでませんでした。 当然やってますよねorz で、改めて。 OSは何をお使いでしょうか。

taka077
質問者

お礼

imagehlp.libをリンクしてませんでした。(デバッグモードでは、インクルードしただけで、正常動作してましたので...) #pragma comment(lib, "imagehlp.lib") をソースに追加し、リンクエラーも解消されました。 ほんとうにありがとうございました!! (ちなみに、OSはXpProです。)

  • FAY
  • ベストアンサー率49% (95/193)
回答No.5

imagehlp.libをリンクして imagehlp.hをインクルードしていますか? #pragma comment(lib, "imagehlp.lib") #include "imagehlp.h"

回答No.3

つ[MakeSureDirectoryPathExists()] APIを使っていいようですし、これ一発で全て終わる気がします。

taka077
質問者

お礼

お礼が遅くなりました。回答ありがとうございます。 以下のように変更し、デバッグモードでうまく動作したのでリリースモードでリビルドしたら、リンクエラーが発生しました。 何分、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の実行エラー 以上、よろしくお願いします。

  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.2

・マルチバイト文字の判定 CharNext系のAPIを使うと便利ですよ。

taka077
質問者

お礼

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

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.1

マルチバイト文字であると判定された場合は、次の'文字'を 比較するようにすればいいだけではないかと思います。

taka077
質問者

お礼

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

関連するQ&A

  • ファイル名のフルパスでの保存

    タイトルどおり、ファイル名をフルパスで、テキストファイルに保存したいと思うのですが、 どうもうまく行きません。 特殊文字のせいか?文字数の制限か? 色々調べてみましたが、解決できなかったため質問させて頂きました。 環境はVisual C++のSDKですが、テキストファイルに出力する部分はただのC言語です。 以下にそのソースを書きます。お気づきの方いらっしゃたらお願いします。。 ----- #define MAX_PATH 260 … char sysFile[]="sys.txt"; //テキストファイル名 char bitPath[MAX_PATH]; //ファイルのフルパス … fp=fopen(sysFile,"w"); fprintf(fp,"%s\n",bitPath); fclose(fp);

  • findnext();について

    下のプログラムなのですが、 色々と調べていくとfindnext();でフリーズしてしまうことがわかりました。 しかし、なぜフリーズするのかわからないのです。 dir.hの書いてある通りに使っているつもりなのですが・・・ 助言お願いいたします。 仕事にいるので早急にお願いいたします。 ちなみにコンパイラはBC4.5++です。 /*****************************************************************/ test.c /*****************************************************************/ #include <stdio.h> #include <dir.h> #include <string.h> #define MAX 10 int main(){ struct ffblk *data; int i; char name[MAX]; char path[MAX]; strcpy(path,"c:\\*.*"); if(findfirst(path,data,0)==0){ while(1){ strcpy(name,data->ff_name); printf("%s",name); if(findnext(data)!=0)break; } } return 0; }

  • ファイル名からフォルダを作成するscript

    以前ここでタイトルのscriptを作っていただきsend toにいれて活用しています。 下記のように複数のファイルを選択した場合と単数の場合を別々に作ってあります。 そこでこれをひとつにまとめてどちらでも対応できるようなものにしたいのですが お知恵をお貸しください。 よろしくお願いします。 (Windows7Pro/64bit) // makefolder3.js fs = new ActiveXObject("Scripting.FileSystemObject"); args = WScript.Arguments; for (i = 0; i < args.Count(); i++) { basename = fs.GetBaseName(args(i)); path = fs.GetParentFolderName(args(i)).replace(/\\$/, ""); target = path + "\\" + basename; if (fs.FileExists(target) || fs.FolderExists(target)) WScript.Echo(target + "\n同名のファイル/フォルダがあります. 作成できません."); else fs.CreateFolder(target); } ------------ // makefolder.js fs = new ActiveXObject("Scripting.FileSystemObject"); arg = WScript.Arguments(0); basename = fs.GetBaseName(arg); path = fs.GetParentFolderName(arg).replace(/\\$/, ""); target = path + "\\" + basename; if (fs.FileExists(target) || fs.FolderExists(target)) WScript.Echo(target + "\n同名のファイル/フォルダがあります. 作成できません."); else fs.CreateFolder(target); ----------

  • システムの特殊なフォルダのパス名の取得を取得しようとしています。

    システムの特殊なフォルダのパス名の取得を取得しようとしています。 VC++2008 Express EditionでSHGetSpecialFolderPathをつかって パスを取ってみようとネット上の例だから拝借して 下記のようなソースを書いてみたのですが、 出てくる結果が、どの場所のパスをとっても「C」しか出てこないのです。 これってなにが原因なのでしょうか? どなたかお教え願えないでしょうか? [ソース] #include<stdio.h> #include<shlobj.h> int main(){ TCHAR buf[_MAX_PATH]; SHGetSpecialFolderPath(NULL, buf, CSIDL_DESKTOPDIRECTORY, FALSE); printf("デスクトップのパスは %s です\n",buf); return 0x00; }

  • ファイルの置換

    ファイルを置換するプログラムを作ったのですがうまく置換してくれません。コードは以下のように書きました。(コンパイラは出来ました) #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 main() { FILE *fp; char filename[256]; FILE *outfp; char outfilename[256]; char key[128]; char str[128]; char c; int p; int keylen; int i=0 ; int search=FALSE; int count =0; printf(" enter filename"); scanf("%s",filename); printf("seach word"); scanf("%s",key); keylen=strlen(key); printf("change word"); scanf("%s",str); if((fp=fopen(filename,"r"))==NULL) { printf("file open error"); exit(1); } strcpy(outfilename,filename); strcat(outfilename,"_"); if((outfp=fopen(outfilename,"w"))==NULL) { printf("file open error"); exit(1); } while((c=fgetc(fp))!=EOF) { if(search) { if(c != key[i]) { search=FALSE; for(p=0;p<i;p++) { fputc(key[p],outfp); } fputc(c,outfp); i=0; } else{i++;} } else { if(c==key[i]) {search=TRUE;i++;} else {fputc(c,outfp);} } if (keylen==i) { count++; fputs(str,outfp); search=FALSE; i=0; } } fclose(fp); fclose(outfp); printf("apperance number %d\n",count); return 0; } どこか間違っていますか?教えてください。

  • ファイル名リストの置換処理

    以前、ファイルリストの取得について教えて頂きました。ありがとうございます。 取得したリストを文字列で入れ替えるにはどうすればよいでしょうか 例えば取得したリストの最初の位置の文字列dml[0]をEcoDataFileNameと置き換えたいです。 #include <Windows.h> #include <map> #include <vector> #include <string> #include <iostream> #include "time.h" using namespace std; bool operator<(const FILETIME& x, const FILETIME& y) { if ( x.dwHighDateTime < y.dwHighDateTime ) return true; if ( y.dwHighDateTime < x.dwHighDateTime ) return false; return x.dwLowDateTime < y.dwLowDateTime; } class DML_Backup { vector<string> files_; public: void search(const char* spec) { typedef multimap<FILETIME,string> map_type; map_type files; WIN32_FIND_DATAA find_data; HANDLE handle = FindFirstFileA(spec, &find_data); if ( handle != INVALID_HANDLE_VALUE) { do {   files.insert(map_type::value_type(find_data.ftLastWriteTime, find_data.cFileName)); } while ( FindNextFileA( handle, &find_data) ); FindClose(handle); } files_.clear(); for ( map_type::iterator iter = files.begin(); iter != files.end(); ++iter ) { files_.push_back(iter->second); } } string operator[](int inx) const { return files_.at(inx).c_str(); } int size() const { return files_.size(); } }; int main() { DML_Backup dml; char EcoDataFileName="MonJun131956122011.ecd"; dml.search("*.ecd"); }

  • 0と1のファイルへの書き込み、出力

    c言語で0と1の乱数を生成し、ファイルに出力したいのですが、出力がおかしくなってしまいます。 正しく0と1をファイルに書き込み、出力するにはどうしたらいいでしょうか。 わかる方いらっしゃいましたら教えてください。 お願い致します。 #include<stdio.h> #include <stdlib.h> #include <time.h> #define max 3000000 #define nrand(n) (int)((double)n*rand()/RAND_MAX) /* 0以上n未満の整数を返す */ int main() {   FILE *Wf;   char W_filename[20];   int *W=(int *)malloc(sizeof(int) * max);   printf("入力ファイル名 : "); scanf("%s",W_filename);   if( ( Wf=fopen(W_filename,"w") ) == NULL ) printf("ファイルを開けません\n");   else   {     for(i=0;i<max;i++)     {     W[i]=nrand(2);     fprintf(Wf,"%d ",W[i]);    }   }   fclose(Wf);   free(W); } 出力が ‰‱‱‰‱‱‰‱‱‰‰‰‰‱‰‱‰‱‰‰ のようになってしまいます。 Wにはちゃんと0か1が入っているみたいなのですが・・・

  • ファイル名の変換

    たびたびですいませんが、まったくの初心者で全然わからずお手上げ状態で困っています。よろしくお願いします 「以下のプログラムで入力ファイル名をID(ref|~~|の~~の部分のことです、例えばNP_000166.2.txtなど)の形に変更しなさい」といった作業をしたいのです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; if (argc != 2){ printf("エラー:プログラム名 入力ファイル\n"); return(0); } if((rfp = fopen(argv[1], "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } i = 0; while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ sprintf(fname,"files/%d.txt",i); if ((wfp =fopen(fname,"w")) == NULL) { printf("出力ファイルが存在しません\n"); return (EXIT_FAILURE); } fprintf(wfp,"%s\t%s\t%d\t%f", id, name, score, evalue); fclose(wfp); i++; } fclose(rfp); return (EXIT_SUCCESS); }

  • Windowsファイルのサイズの問題

    ネットでWindowsのファイルのサイズを計算するサンプルをみています。 ひとつのサンプルをみても、わからないですので、知っている方に質問したいです。 サンプルは WFDはWIN32_FIND_DATA構造体の変数で、 DWORD dwHigh = WFD.nFileSizeHigh; DWORD dwLow = WFD.nFileSizeLow; __int64 nSize; int nLen; char szTemp[MAX_PATH]; char* p; int nCnt; nSize = dwHigh; nSize = (nSize << 32) + 1023; nSize += dwLow; nSize = (nSize >> 10); //KB単位にする いくつの問題があります。 ●ファイルのサイズは、どうしてこんなに計算するの?  どう計算するの? ●(nSize << 32) とnSize >> 10 はなにをやっているの? よろしくお願いします。

  • Linuxでフォルダ内全ファイル名の読み込み

    windowsで以下のような,フォルダ内の全ファイルのファイル名を先頭から順に読みこんでいき,読み込むごとにmain2()で処理を行うというプログラムを作りました. これを急遽Linuxで動作させなければならなくなったのですが,windows.hを使用しているので当然動きません. Linuxでdirent.hを使用して動かすにはどうすればよいのでしょうか. あつかましいでしょうが,急ぎの用なので出来れば書き直していただけるとありがたいです. char FilePathBmp[] = "temp\\*.bmp"; // ← Tempフォルダ内のbmpファイルを指定しています char FindPathBmp[50]; HANDLE hFind; WIN32_FIND_DATA fd; CreateColortable(); hFind = FindFirstFile( FilePathBmp, &fd ); do { strcpy( FindPathBmp, fd.cFileName ); main2(FindPathBmp); } while( FindNextFile( hFind, &fd ) );

専門家に質問してみよう