SHFileOperationの使い方 – プログラミング – Home

通知
すべてクリア

[解決済] SHFileOperationの使い方


クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

困ってます。どなたか教えてください。
「SHFileOperation」を使って、CDの中身やフォルダの中身をごっそりとコピーしたいのです
が、
「ファイルをコピーできません。送り側のファイルまたはディスクから読み取れません。」
と出てうまくいきません。
実は、CString型を使ったワイルドカード使用のコピーならば、うまくいったのですが・・・
それだと、フォルダがコピーできなかったので、あえなくchar型に変更し、[\0\0]を使ってみ
たのですが、
悲惨な目に会ってしまっている現状です。
もし良かったら、CString型を使った、ごっそりコピーの方法を教えていただけませんでしょう
か?(char型でもかまいませんが・・・)
お願いです。よきアドバイスをお願いします。


引用未解決
トピックタグ
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

ちなみに、コードは、下記のようにして関数化しています。

/*---------------------------------------------------------------------------*/
// 機能 : ファイル操作ダイアログ使用
// 引数 : UINT &Operation ...操作指定
// FO_MOVE :移動
// FO_COPY :コピー
// FO_DELETE :削除
// FO_RENAME :名前変更
// CHAR *sOrdFolder...コピー元フォルダ
// CHAR *sNewFolder...コピー先フォルダ
// BOOL Copy_F ...TRUE:ワイルドカード使用,FALSE:フォルダコピー
// 戻り値: TRUE:それ以外,FALSE:キャンセル
BOOL CVolume::f_SHFileOperation(HWND hWnd,
int Operation,
char *sOrdFolder,
char *sNewFolder,
BOOL Copy_F)
{
BOOL BRet = TRUE;
int iRet;
SHFILEOPSTRUCT tSHFileOp; // ファイル操作構造体

tSHFileOp.hwnd = hWnd;
tSHFileOp.wFunc = Operation;
tSHFileOp.pFrom = sOrdFolder;
tSHFileOp.pTo = sNewFolder;
if( Copy_F == TRUE )
tSHFileOp.fFlags = FOF_FILESONLY + FOF_MULTIDESTFILES + FOF_NOCONFIRMATION
+ FOF_NOCONFIRMMKDIR ;// + FOF_SIMPLEPROGRESS;
else
tSHFileOp.fFlags = FOF_MULTIDESTFILES + FOF_NOCONFIRMATION +
FOF_NOCONFIRMMKDIR ;// + FOF_SIMPLEPROGRESS;
tSHFileOp.fAnyOperationsAborted = TRUE;
tSHFileOp.lpszProgressTitle = ";

//フォルダをコピーする
SHFileOperation(&tSHFileOp);

iRet = tSHFileOp.fAnyOperationsAborted;
if( iRet !=0 ) BRet = FALSE;
else BRet = TRUE;

return (BRet);
}


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

できました!
CString型でも出来るようにしました。
CString型は最後に[\0](NULL)が入らないので、領域を無理やり確保し、拡張したところに
[0]を入れる事で可能となりました。
勝手に困っておいて、一人で解決しているのですいませんm(__)m
でも、まだ、削除が出来ないので、まだ解決にはなっていないのでもう暫く解決にしないでおき
ます。
多分、読取解除をしないといけないのかなぁ・・・

以下に修正したコードを記述しておきます。

/*---------------------------------------------------------------------------*/
// 機能 : ファイル操作ダイアログ使用
// 引数 : int Operation ...操作指定
// FO_MOVE :移動
// FO_COPY :コピー
// FO_DELETE :削除
// FO_RENAME :名前変更
// CString &OldPath......コピー元フォルダ
// CString &NewPath......コピー先フォルダ
// 戻り値: TRUE:それ以外,FALSE:キャンセル
BOOL CVolume::f_SHFileOperation(HWND hWnd,
int Operation,
CString &OldPath,
CString &NewPath)
{
BOOL BRet = TRUE;
int iRet;
SHFILEOPSTRUCT tSHFileOp; //ファイル操作構造体

ZeroMemory(&tSHFileOp, sizeof(SHFILEOPSTRUCT));

OldPath = OldPath + ?;
OldPath.SetAt(OldPath.GetLength()-1,0);
NewPath = NewPath + ?;
NewPath.SetAt(NewPath.GetLength()-1,0);

tSHFileOp.hwnd = hWnd;
tSHFileOp.wFunc = Operation;
tSHFileOp.pFrom = OldPath;
tSHFileOp.pTo = NewPath;
tSHFileOp.fFlags = FOF_MULTIDESTFILES
+ FOF_NOCONFIRMATION
+ FOF_NOCONFIRMMKDIR;
//+ FOF_SIMPLEPROGRESS;
tSHFileOp.fAnyOperationsAborted = TRUE;
tSHFileOp.lpszProgressTitle = NULL;

//処理する
SHFileOperation(&tSHFileOp);

iRet = tSHFileOp.fAnyOperationsAborted;
if( iRet !=0 ) BRet = FALSE;
else BRet = TRUE;

return (BRet);
}


返信引用
クリリン
 クリリン
(@クリリン)
ゲスト
結合: 23年前
投稿: 175
Topic starter  

あ、すいません。削除もちゃんとできました。
勝手に盛り上がってすいませんでした。
それにしても、今回は自分で解決しましたが、
このサイトのおかげでかなり助かっております。
管理者様、これからも頑張って下さい。
では、また・・・


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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