使用IFileOperation(C ++)的CopyFiles

时间:2014-02-17 11:04:48

标签: c++

我想使用IFileOperation复制多个文件。 复制单个文件不是这个例子的问题: http://msdn.microsoft.com/en-us/library/windows/desktop/bb775761%28v=vs.85%29.aspx

我的问题是我找不到复制多个文件的方法,如* .txt。 我尝试过使用SHCreateShellItemArrayFromIDLists,就像这个片段一样:

    IShellItem *psiTo = NULL;
    HRESULT hr = SHCreateItemFromParsingName( csTarget, NULL, IID_PPV_ARGS(&psiTo) );
    LPCITEMIDLIST pidlFiles = ILCreateFromPath(csSource);
    UINT count = sizeof(pidlFiles);
    IShellItemArray* psiaFiles = NULL;
    hr = SHCreateShellItemArrayFromIDLists(count, &pidlFiles, &psiaFiles);
    hr = pfo->CopyItems(psiaFiles, psiTo);
    hr = pfo->PerformOperations();

另一种方法是使用SHCreateShellItemArray,如下所示:

LPCITEMIDLIST pidlParent = ILCreateFromPath(_T("C:\\"));
LPCITEMIDLIST pidlChild = ILCreateFromPath(_T("C:\\Temp\\*.txt"));
HRESULT hr = SHCreateShellItemArray(pidlParent, NULL, 1, &pidlChild, &psiaFiles);
hr = pfo->CopyItems(psiaFiles, psiTo);
hr = pfo->PerformOperations();

我尝试了不同的方法但几乎得到了E_INVALIDIDARG或ERROR_PATH_NOT_FOUND。 怎么了?

1 个答案:

答案 0 :(得分:1)

ILCreateFromPath不会使用通配符。不能,因为它返回一个PIDLIST_ABSOLUTE

最简单的解决方案是手动枚举所有文件FindFirstFile(*.txt),在每个结果上调用CopyItem,然后在结尾处调用PerformOperations一次。

像往常一样,较旧的Windows功能更好。 SHFileOperation简单十倍且能够启动:它确实直接支持通配符。