SHFileOperationの実行でエラーが発生 – プログラミング – Home

通知
すべてクリア

[解決済] SHFileOperationの実行でエラーが発生


松本 和久
 松本 和久
(@松本 和久)
ゲスト
結合: 18年前
投稿: 3
Topic starter  

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;
}


引用未解決
トピックタグ
松本 和久
 松本 和久
(@松本 和久)
ゲスト
結合: 18年前
投稿: 3
Topic starter  

  記述間違いありました。
 
  DeleteDirectory(file_name );
  は
  DeleteDirectory( stNextPath1 );
  の間違いです。すみません。

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> stNextPath1= C:\\TEST+'\0' ;
ここ,おかしくないですか?(コンパイルエラーはでない?)

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


返信引用
Force
 Force
(@Force)
ゲスト
結合: 18年前
投稿: 5
 

SHFILEOPSTRUCTのLPCTSTR型のメンバは
CString 変数を使うと動作しません。


返信引用
Force
 Force
(@Force)
ゲスト
結合: 18年前
投稿: 5
 

間違えちゃいました。
× SHFILEOPSTRUCTのLPCTSTR型のメンバは
○ SHFILEOPSTRUCTのLPCSTR型のメンバは


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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

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


返信引用
松本 和久
 松本 和久
(@松本 和久)
ゲスト
結合: 18年前
投稿: 3
Topic starter  

エラー表示がなくなり、フォルダの削除ができました。

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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました