HowTo: Afficher la boîte de dialog de progression à l’aide d’IFileOperation

J’essaie d’obtenir une boîte de dialog de progression à afficher pour mon opération de copie dans un exemple de code. J’utilise IFileOperation parce que j’ai constaté que l’utilisation de SHFileOperation n’affichera aucune boîte de dialog de progression si les fichiers ont déjà été copiés à l’emplacement cible. J’espère qu’IFileOperation est un peu plus sophistiqué et peut gérer cette situation. Voici l’exemple de code que j’ai essayé….

CComPtr opProgressDlg; HRESULT hr = opProgressDlg.CoCreateInstance(CLSID_ProgressDialog); CComPtr fileOp; hr = fileOp.CoCreateInstance(CLSID_FileOperation); hr = fileOp->SetOperationFlags(FOF_RENAMEONCOLLISION | FOFX_PRESERVEFILEEXTENSIONS | FOFX_NOMINIMIZEBOX); hr = fileOp->SetProgressDialog(opProgressDlg); hr = opProgressDlg->StartProgressDialog(m_hWnd, OPPROGDLG_DEFAULT); hr = opProgressDlg->SetMode(PDM_DEFAULT); hr = opProgressDlg->SetOperation(SPACTION_COPYING); oldDirectory += _T("*.*"); CFileFind finder; BOOL bWorking = finder.FindFile(oldDirectory); while (bWorking) { bWorking = finder.FindNextFile(); if (finder.IsDots()) continue; CSsortingng name = finder.GetFilePath(); IShellItem *psiFrom = nullptr; hr = SHCreateItemFromParsingName(CT2CW(name), NULL, IID_PPV_ARGS(&psiFrom)); IShellItem *psiTo = NULL; hr = SHCreateItemFromParsingName(CT2CW(newDirectory), NULL, IID_PPV_ARGS(&psiTo)); hr = fileOp->CopyItem(psiFrom, psiTo, CT2CW(finder.GetFileName()), NULL); //hr = opProgressDlg->UpdateLocations(psiFrom, psiTo, psiTo); } opProgressDlg->StopProgressDialog(); hr = fileOp->PerformOperations(); 

L’exemple tente de copier tous les fichiers et dossiers d’un emplacement (oldDirectory) à un autre (newDirectory). L’opération de copie copie tout correctement . Je cherche de l’aide pour que la boîte de dialog de progression s’affiche pendant l’opération. Selon IFileOperation, je devrais pouvoir définir le dialog de progression via IOperationsProgressDialog . La documentation à ce sujet est extrêmement mince. Je n’ai pas pu trouver d’échantillons montrant comment assembler les deux. Est-ce que quelqu’un a de l’expérience avec ces deux interfaces?

Si vous avez juste besoin d’une boîte de dialog de progression, supprimez la référence à IOperationsProgressDialog

CopyItem prépare uniquement les éléments pour la copie. Par conséquent, IOperationsProgressDialog::Update... ne mettra à jour aucune interface utilisateur. La copie commence dès que PerformOperations est appelé.

La boîte de dialog de l’interface utilisateur n’indiquera pas s’il n’y a que quelques fichiers, car l’opération est effectuée trop rapidement. Vous souhaitez peut-être supprimer FOF_RENAMEONCOLLISION pour faciliter les tests. Cela devrait être exactement la même chose que SHFileOperation .

 CSsortingng srcDir = L"c:\\test\\src"; CSsortingng dstDir = L"c:\\test\\dst"; CComPtr fileOp; fileOp.CoCreateInstance(CLSID_FileOperation); fileOp->SetOperationFlags(FOFX_SHOWELEVATIONPROMPT); srcDir += L"\\*"; CFileFind finder; BOOL next = finder.FindFile(srcDir); while (next) { next = finder.FindNextFile(); if (finder.IsDots()) continue; CComPtr src, dst; if (S_OK != SHCreateItemFromParsingName(finder.GetFilePath(), NULL, IID_PPV_ARGS(&src))) continue; if (S_OK != SHCreateItemFromParsingName(dstDir, NULL, IID_PPV_ARGS(&dst))) continue; fileOp->CopyItem(src, dst, 0, NULL); } MessageBox(L"nothing copied so far..."); hr = fileOp->PerformOperations(); MessageBox(L"done...");