如何:使用 IFileOperation 显示进度对话框
HowTo: Display progress dialog using IFileOperation
我试图在一些示例代码中为我的复制操作显示一个进度对话框。我使用 IFileOperation 是因为我发现使用 SHFileOperation 如果文件已经复制到目标位置。我希望 IFileOperation 更复杂一点,可以处理这种情况。
这是我试过的示例代码......
CComPtr<IOperationsProgressDialog> opProgressDlg;
HRESULT hr = opProgressDlg.CoCreateInstance(CLSID_ProgressDialog);
CComPtr<IFileOperation> 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;
CString 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();
样本试图将所有 个文件和文件夹从一个位置 (oldDirectory) 复制到另一个位置 (newDirectory)。 复制操作确实复制了所有内容。我正在寻求帮助以在操作期间显示进度对话框。根据IFileOperation,我应该可以通过IOperationsProgressDialog来设置进度对话框。这方面的文档非常薄。我还没有找到任何样本来展示如何将两者结合在一起。有人对这两个接口有经验吗?
如果您只需要进度对话框,请删除对 IOperationsProgressDialog
的引用
CopyItem
只准备复制的项目,因此 IOperationsProgressDialog::Update...
不会更新任何 UI。实际复制在调用 PerformOperations
时开始。
UI 如果只有几个文件,对话框将不会显示,因为它完成得太快了。也许您想删除 FOF_RENAMEONCOLLISION
以便于测试。这应该与 SHFileOperation
.
完全相同
CString srcDir = L"c:\test\src";
CString dstDir = L"c:\test\dst";
CComPtr<IFileOperation> 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<IShellItem> 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...");
我试图在一些示例代码中为我的复制操作显示一个进度对话框。我使用 IFileOperation 是因为我发现使用 SHFileOperation 如果文件已经复制到目标位置。我希望 IFileOperation 更复杂一点,可以处理这种情况。 这是我试过的示例代码......
CComPtr<IOperationsProgressDialog> opProgressDlg;
HRESULT hr = opProgressDlg.CoCreateInstance(CLSID_ProgressDialog);
CComPtr<IFileOperation> 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;
CString 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();
样本试图将所有 个文件和文件夹从一个位置 (oldDirectory) 复制到另一个位置 (newDirectory)。 复制操作确实复制了所有内容。我正在寻求帮助以在操作期间显示进度对话框。根据IFileOperation,我应该可以通过IOperationsProgressDialog来设置进度对话框。这方面的文档非常薄。我还没有找到任何样本来展示如何将两者结合在一起。有人对这两个接口有经验吗?
如果您只需要进度对话框,请删除对 IOperationsProgressDialog
CopyItem
只准备复制的项目,因此 IOperationsProgressDialog::Update...
不会更新任何 UI。实际复制在调用 PerformOperations
时开始。
UI 如果只有几个文件,对话框将不会显示,因为它完成得太快了。也许您想删除 FOF_RENAMEONCOLLISION
以便于测试。这应该与 SHFileOperation
.
CString srcDir = L"c:\test\src";
CString dstDir = L"c:\test\dst";
CComPtr<IFileOperation> 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<IShellItem> 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...");