SHFileOperationの使い方

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

クリリン 2002/01/29(火) 18:30:19
ちなみに、コードは、下記のようにして関数化しています。

/*---------------------------------------------------------------------------*/
//  機能 :  ファイル操作ダイアログ使用
//  引数 :  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);
}

クリリン 2002/01/29(火) 20:30:06
できました!
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);
}

クリリン 2002/01/29(火) 20:43:15
[[解決]]
あ、すいません。削除もちゃんとできました。
勝手に盛り上がってすいませんでした。
それにしても、今回は自分で解決しましたが、
このサイトのおかげでかなり助かっております。
管理者様、これからも頑張って下さい。
では、また・・・

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