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