読込んだ文字列でDeleteFileWを使うには

このQ&Aのポイント
  • Visual Studio2005を用いて、Windows Mobile上で動作するWin32アプリケーションをコーディングしています。
  • 読み込んだ文字列をANSIからUnicodeに変換してファイルを削除する方法について困っています。
  • コード内でのファイルの読み込みや削除の処理に関して、意見を聞きたいです。
回答を見る
  • ベストアンサー

読込んだ文字列でDeleteFileWを使うには

Visual Studio2005を用いて、Windows Mobile上で動作するWin32アプリケーションを コーディングしています。言語はC++を選択しています。 DeleteFileW関数で困っており、みなさんのご意見を聞かせていただきたいと思います。 よろしくお願いします。 ・PGの概要 ファイルに書かれている内容(削除したいファイルのパス及びファイル名)を読み込んで、 該当するファイルをDeleteFileW関数で削除するというものです。 ・困っている点 読み込んだ文字列をANSIからUnicodeに変換しても(下記のdelete_file1())、 パスを記載したファイルをUnicodeで作成して読み込んでも(下記のdelete_file2())、 ファイルを削除できません。 コンパイルは正常にできるので、何が悪いのかわかりません。 ・コード #include<windows.h> #include<norify.h> #include<stdio.h> //ANSIで読み込んだ文字列をUnicodeに変換して指定したファイルを削除する int delete_file1() { FILE *fp; char readString[42] = ""; TCHAR readString2[42] = L""; if((fp = fopen("\\Storage Card\\test.txt", "r")) == NULL) { MessageBoxW(NULL, L"open_error", L"open_error", 0); } fgets(readString, 42, fp); { #ifdef UNICODE MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, readString, 42, readString2, sizeof(readString)); #else strcpy(readString2,readString); #endif if( DeleteFileW(readString2) == TRUE) { MessageBoxW(NULL, readString2, L"delete_OK", 0); }else{ MessageBoxW(NULL, readString2, L"delete_NG", 0); } return 0; } //中身がUnicodeで書かれたファイルを読み込んで指定されたファイルを削除する int delete_file2() { HANDLE hand; hand = CreateFile(L"\\Storage Card\\testread.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); TCHAR readString[MAX_PATH]; DWORD dword; ReadFile(hand, readString, sizeof(readString), &dword, NULL); CloseHandle(hand); if( DeleteFileW(readString) == TRUE) { MessageBoxW(NULL, readString2, L"delete_OK", 0); }else{ MessageBoxW(NULL, readString2, L"delete_NG", 0); } return 0; } //メイン関数 int WinMain(HINSTANCE hInstance, HINSTANCE hPreinstance, LPWSTR lpCmdLine, int nShowCmd) { //動作を確認したい方をコメントアウトから外して実行 // delete_file1(); // delete_file2(); return 0; }

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, readString, 42, readString2, sizeof(readString)); マジックナンバーだったり、sizeof()だったりと…統一取れていませんね… MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, readString, -1, NULL, 0); で必要な文字数を取得して、メモリ確保後、改めて確保したバッファと文字数を指定して変換してみてはどうですか? >if( DeleteFileW(readString) == TRUE) >{ >MessageBoxW(NULL, readString2, L"delete_OK", 0); >}else{ >MessageBoxW(NULL, readString2, L"delete_NG", 0); >} NGで…… GetLastError()でエラーコードを調べる必要はないのでしょうか? ROMファイルを削除しようとしている。 そもそも変換が正しくない。 とか…まぁ、いろいろ考えられはしますが……。

ia06043
質問者

お礼

ご回答ありがとうございました。 読み込むファイルの中身のパスの記述を\\を\に変更し、 読み込んだあと、改行コードを取り除くことで、正常に動作しました。

ia06043
質問者

補足

回答ありがとうございます。 >マジックナンバーだったり、sizeof()だったりと…統一取れていませんね… すみません、色々いじったままで、チェック抜けてました。 >必要な文字数を取得して、メモリ確保後、改めて確保したバッファと文字数を指定して変換してみてはどうですか? 試してみましたが、うまくいきませんでした。 メモリサイズの問題ではないかと思います。 >GetLastError()でエラーコードを調べる必要はないのでしょうか? 参考にしたものに載っていなかったので、使っていませんでした。 思わぬエラーがあるかもしれないので、試してみます。 >ROMファイルを削除しようとしている。 削除しようとしているのは、自分で作成したファイルで、 WCAHR str[MAX_PATH] = ..... というようにPG内で宣言した変数を DeleteFileW関数に渡すと削除出来るので、ROMではないかと思います。 >そもそも変換が正しくない。 そう思いまして、OutputDebugString関数やMessageBoxW関数で表示してみたところ、 削除するファイルのパスとファイル名がちゃんと表示されます。 とりあえず、早くエラーコードを調べてみます。 迅速な対応していただいたのに、反応が遅くてすみませんでした。

関連するQ&A

  • fwprintf()について

    テキストファイルに全角文字を出力したのですがなぜか出力するとテキストファイルには???と出力されてしまいます。 どうしたらちゃんと出力されるでしょうか? #include<windows.h> #include<TCHAR.h> int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hprevInst,LPTSTR nCmdLine,int nCmdShow) { FILE* fp; fp=_wfopen(_T("takoyaki.txt"),_T("w")); if(fp==NULL) { MessageBox(NULL,_T("ファイルが開きません"),_T("エラー"),MB_OK); } fwprintf(fp,_T("%s"),_T("おはよう。")); return 0; } 環境はWinXP pro、 開発環境はVC++2005です。 よろしくお願いします。

  • ファイルから文字列を読み出して16進数に変換

    test1.txtというファイルから文字列を読み出して16進数に変換、という処理をしたいのですがうまくいきません。どこがどう悪いのでしょうか?ご教授のほどお願いします。 ---------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp; char *fname = "test1.txt"; char str[100]; int num; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%s is not open.\n", fname ); return -1; } while( fgets(str, 100, fp ) != NULL ){ num = strtol(str, NULL, 16); printf( "%s", str ); printf("%x\n", num); //ここでうまく出力されません } fclose( fp ); return 0; } ---------------- ちなみに、test1.txtの中身は以下のようになってます。 44DB4147E6075A92E878EB68C44DD51F 5DCE86622D846BF272215A792AF31A3E 46FF69A29D3DF1D4842461B239256C26

  • CComBSTR型文字列の

    こんにちは 目黒@C++学習中です CComBSTR型の文字列の編集方法について教えて下さい。 既に代入済みのCComBSTR型の文字列を短くする方法がわかりません 以下はテストソースです。 sName = sName.m_str;の行を入れれば取あえず可能ですが BoundsCheckerでエラーになります。 m_strをfreeしている為。 #スペースがトリムされてしまう、 #トリムを防ぐ方法があったら教えて下さい #define UNICODE #define _UNICODE #include <windows.h> #include <atlbase.h> int main(void) { CComBSTR sName; sName = L"012345789\\abc"; long lSize = sName.Length(); WCHAR* sP = ::StrRChr(sName,NULL,L'\\'); if (sP != NULL) { *sP = 0; lSize = sName.Length(); // sName = sName.m_str; } sName += L"efg"; return EXIT_SUCCESS; }

  • C言語でCSVファイルのオープン・クローズができな

    C言語でCSVファイルのオープン・クローズができない。 下記のプログラムですが、CSVファイルが読み込めません。 どのようにすれば読み込めるのでしょうか。よろしくお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("aaa.csv","r"); if (fp == NULL) printf("ファイルを開けません。"); else { fclose(fp); } return(0); }

  • マウスフックについて

    Dllにてマウスフックをして、左ボタンが押しあがったらWM_LBUTTONUPされたら メッセージを送信するというものです。 そのときに、マウスの位置はどこにあってもいいのです。 たとえば、自分のウインドウの中で左ボタンを押して、 デスクトップ上などで左ボタンがあがったらメッセージを送信するというようにしたいのですがうまくいきません。 以下がソースです。 よろしくお願いします。 #include <windows.h> #include "MouseHook.h" HINSTANCE hInst; HHOOK hHook; HWND hWnd; BOOL bHook; int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) { hInst = hInstance; return TRUE; } EXPORT int SetMainHWND(HWND hMainWindow) { hWnd = hMainWindow; return 0; } EXPORT BOOL IsHooking() { if (bHook) return TRUE; else return FALSE; } EXPORT int MouseHookSet() { hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc,hInst, NULL); if (hHook == NULL) { return -1; } else { bHook = TRUE; return 0; } } EXPORT int MouseHookEnd() { if (UnhookWindowsHookEx(hHook) != 0) { bHook = FALSE; return 0; } else { return -1; } } EXPORT LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { MOUSEHOOKSTRUCT *pmh; pmh = (MOUSEHOOKSTRUCT *)lParam; if (wParam == WM_LBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } if (wParam == WM_NCLBUTTONUP) { SendMessage(hWnd,MOUSEHOOK_LBUTTONUP,0,0); } return CallNextHookEx(hHook,nCode,wParam,lParam); }

  • fopenのモード文字列について

    fopenのモード文字列が w の時について何ですが、 #include <stdio.h> int main(void){ FILE *fp; fp=fopen("test.txt","w"); fclose(fp); return 0; } でファイルを作成した時 作成したファイルと同じディレクトリーに同じ名前のファイルが 存在するときは元のファイルに上書き(?)してファイルが作成されますよね? これは1度元のファイルを削除してから新たにファイルを作成しているのか、それとも元ファイルを空にしただけなのでしょうか?

  • Cのソースファイルにすると警告が出る理由

    wavファイルを再生するプログラムを勉強中なのですが、下のプログラムをビルドすると error C2055: 型リストではなく、仮パラメーター リストが必要です。 warning C4047: '関数' : 間接参照のレベルが 'MCIDEVICEID' と 'void *' で異なっています。 warning C4024: 'mciSendCommandW' : の型が 1 の仮引数および実引数と異なります。 という警告が出ます。 いろいろ試した結果、ソースファイルの拡張子をcからcppに変更したら警告が消えたのですがどうして拡張子がCのソースファイルでビルドすると警告がでるのか理由が全く分かりません。 拡張子を変更しないで警告を出さないようにするにはどこを直せばいいのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語 #include<Windows.h> #include "resource.h" #include<MMSystem.h> #pragma comment(lib,"winmm.lib") HINSTANCE hinst; INT_PTR CALLBACK dlgproc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int nCmdShow) { hinst=hInstance; DialogBox(hinst,TEXT("mydlg"),NULL,dlgproc); return 0; } INT_PTR CALLBACK dlgproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { static MCI_OPEN_PARMS mop; static MCI_PLAY_PARMS play; switch(msg) { case WM_INITDIALOG: mop.lpstrDeviceType=TEXT("WaveAudio"); mop.lpstrElementName=TEXT("C:\\Users\\test.wav"); mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD_PTR)&mop); mciSendCommand(mop.wDeviceID,MCI_PLAY,NULL,(DWORD_PTR)&play); return (INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwnd,LOWORD(wp)); return (INT_PTR)TRUE; break; } return(INT_PTR)FALSE; }

  • ファイル

    c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?

  • 文字列クラスを作りたいと思っています

    文字列クラスを作りたいと思っています。 以下のようなところまでは作れましたが、 エラーがでてしまいます。 どこかおかしいところがあるのでしょうか? *********************************************** #include<stdio.h> #include<string.h> class stt { public: char *str; int len; bool maked; stt::stt() { len=0; str=NULL; maked=false; } stt::~stt() { delete[] str; } stt &operator =(char *c) { if(maked) { delete[] str; maked=false; } len=strlen(c); str=new char[len]; strcpy(str,c); maked=true; return (*this); } virtual operator char*() { return str; } }; int main() { stt s; s="Hello World"; printf(s); getchar(); return 0; } ***********************************************

専門家に質問してみよう