SHFileOperationの実行でエラーが発生

[戻る]
松本 和久 2006/07/05(水) 17:48:45
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;
}

松本 和久 2006/07/05(水) 17:55:49
    
  記述間違いありました。
 
  DeleteDirectory(file_name );
  は
  DeleteDirectory( stNextPath1 );
  の間違いです。すみません。

  尚、C:\\TESTフォルダの下にサブディレクトリーは存在しない状態です。

Blue 2006/07/05(水) 18:05:20
> stNextPath1= "C:\\TEST"+'\0' ;
ここ,おかしくないですか?(コンパイルエラーはでない?)

const char*型変数に + 0 しています。

Force 2006/07/06(木) 08:50:50
SHFILEOPSTRUCTのLPCTSTR型のメンバは
CString 変数を使うと動作しません。

Force 2006/07/06(木) 08:52:46
間違えちゃいました。
× SHFILEOPSTRUCTのLPCTSTR型のメンバは
○ SHFILEOPSTRUCTのLPCSTR型のメンバは

tetrapod 2006/07/06(木) 09:01:25
おかしいのはおかしいのですが、これは次のように解釈されコンパイルに通ってしまいます。
CString("C:\\TEST").operator+('\0')
コンパイルには通りますが stNextPath1.GetLength() は 7 のままです。
CString は終端 \0 文字を2つ保持しない仕様になっていますので。

>ファイル名の最後にもう一つ'\0'は付けています。
付けたつもりのコードになっていますが、実際にはなっていません。
strcat(..., "\0"); って書いたとしても \0 文字は2つになりません。

松本 和久 2006/07/06(木) 09:50:58
[[解決]]
エラー表示がなくなり、フォルダの削除ができました。

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;

tetrapod 2006/07/06(木) 09:59:52
解決後にアレだけど大きく間違っていたので訂正 orz
> CString("C:\\TEST").operator+('\0')
ぜんぜん違う。 "C:\\TEST"+0 だから単純にポインタ値に 0 を加えてるだけの話
単に "C:\\TEST" と書いたのと全く同じことになっています。

>Force さんの言うとおり SHFILEOPSTRUCTのLPCSTR型のメンバは
>削除ファイル名の指定にCString 変数を使うと動作しないようです。
この理由は CString が \0 を2つ保持しないからです。
CString が悪いわけでも SHFILEOPSTRUCT が悪いわけでもなく、相性が悪いだけ

古いスレッドには追加発言できません。