SHFileOperationで削除実行を行なうと”フォルダの削除ができません。
送り側ファイルまたはディスクから読めませんのエラーが発生してしまいます。
同様にフォルダーのコピーなどもNGです。
ファイル名の最後にもう一つ'\0'は付けています。
CStringではなくcharでもNGでした。
何かSHFileOperationを使う上での初期化が足りないのでしょうか?
お忙しいと思いますが宜しく御願いいたします。
void main(){
CString stNextPath1;
stNextPath1= C:\\TEST+'\0' ;
DeleteDirectory(file_name );
}
int DeleteDirectory( const CString& Path )
{
SHFILEOPSTRUCT opstruct;
int Status;
memset( &opstruct, 0, sizeof SHFILEOPSTRUCT );
opstruct.hwnd = m_hWnd;
opstruct.wFunc = FO_DELETE;
opstruct.pFrom = Path;
opstruct.pTo = NULL;
opstruct.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR |
FOF_SIMPLEPROGRESS;
opstruct.fAnyOperationsAborted = TRUE;
Status = SHFileOperation( &opstruct );
return Status;
}
記述間違いありました。
DeleteDirectory(file_name );
は
DeleteDirectory( stNextPath1 );
の間違いです。すみません。
尚、C:\\TESTフォルダの下にサブディレクトリーは存在しない状態です。
> stNextPath1= C:\\TEST+'\0' ;
ここ,おかしくないですか?(コンパイルエラーはでない?)
const char*型変数に + 0 しています。
SHFILEOPSTRUCTのLPCTSTR型のメンバは
CString 変数を使うと動作しません。
間違えちゃいました。
× SHFILEOPSTRUCTのLPCTSTR型のメンバは
○ SHFILEOPSTRUCTのLPCSTR型のメンバは
おかしいのはおかしいのですが、これは次のように解釈されコンパイルに通ってしまいます。
CString(C:\\TEST).operator+('\0')
コンパイルには通りますが stNextPath1.GetLength() は 7 のままです。
CString は終端 \0 文字を2つ保持しない仕様になっていますので。
>ファイル名の最後にもう一つ'\0'は付けています。
付けたつもりのコードになっていますが、実際にはなっていません。
strcat(..., \0); って書いたとしても \0 文字は2つになりません。
エラー表示がなくなり、フォルダの削除ができました。
Force さんの言うとおり SHFILEOPSTRUCTのLPCSTR型のメンバは
削除ファイル名の指定にCString 変数を使うと動作しないようです。
また、tetrapod さんの言うとおり
CString は終端 \0 文字を2つ保持しない仕様でした。
CStringからcharに変更してみたらOKになりました。
皆様のアドバイス、ありがとうございました。
void main()
{
memset(file_name,0,sizeof(file_name));
strcpy(file_name,C:\\TEST);
DeleteDirectory(file_name );
}
int CTyouseiDlg::DeleteDirectory( char *filename )
{
SHFILEOPSTRUCT opstruct;
memset( &opstruct, 0, sizeof(SHFILEOPSTRUCT) );
opstruct.pFrom = filename;
解決後にアレだけど大きく間違っていたので訂正 orz
> CString(C:\\TEST).operator+('\0')
ぜんぜん違う。 C:\\TEST+0 だから単純にポインタ値に 0 を加えてるだけの話
単に C:\\TEST と書いたのと全く同じことになっています。
>Force さんの言うとおり SHFILEOPSTRUCTのLPCSTR型のメンバは
>削除ファイル名の指定にCString 変数を使うと動作しないようです。
この理由は CString が \0 を2つ保持しないからです。
CString が悪いわけでも SHFILEOPSTRUCT が悪いわけでもなく、相性が悪いだけ