【问题标题】:How do I empty a folder using IFileOperation如何使用 IFileOperation 清空文件夹
【发布时间】:2013-10-22 23:16:25
【问题描述】:

我有一个看起来像这样的辅助方法:

HRESULT DeleteFolderAndContainedFiles(IShellItem *psiFolder)
{
    IFileOperation *pfo;
    HRESULT hr = CreateAndInitializeFileOperation(IID_PPV_ARGS(&pfo));
    if (SUCCEEDED(hr))
    {
        hr = pfo->DeleteItem(psiFolder, NULL);
        if (SUCCEEDED(hr))
        {
            hr = pfo->PerformOperations();
        }
        pfo->Release();
    }
    return hr;
}

如何使用IShellItem(我没有经验)调用此方法?我想将C:\data\test 之类的路径传递给它,它应该清除测试目录下的所有内容,但不删除test 目录。

【问题讨论】:

    标签: c++ windows file


    【解决方案1】:
    IShellItem* item = NULL;
    SHCreateItemFromParsingName(L"C:\\data\\test", NULL, IID_PPV_ARGS(&item));
    

    【讨论】:

    • 没用。这将导致test 文件夹也被删除。
    • @Ajay 对于名为DeleteFolderAndContainedFiles 的函数,这样做是错误的,因为...?
    • 因为它也删除了 'temp' 文件夹,这不是 OP 所要求的。它下的所有文件和文件夹都应该删除,而不是文件夹本身。
    • @Ajay 好吧,OP 提出的具体问题是“我怎样才能调用这个方法?”这是我回答的问题。如果该方法实际上并没有做 OP 真正想做的事情,也许这是一个错误的问题。
    • IShellItem使用后是否应该释放?
    【解决方案2】:

    由于您不想删除指定文件夹本身,只删除其内容,因此您必须枚举文件夹的内容并单独删除它们。尝试调用IShellItem::BindToHandler(BHID_EnumItems) 来获取代表内容的IEnumShellItems 并将其传递给IFileOperation::DeleteItems(),而不是将IShellItem 本身传递给IFileOperation::DeleteItem()

    hr = psiFolder->BindToHandler(NULL, BHID_EnumItems, IID_IEnumShellItems, (void**)&pEnum);
    if (SUCCEEDED(hr))
    {
        hr = pfo->DeleteItems(pEnum);
        if (SUCCEEDED(hr))
        {
            hr = pfo->PerformOperations();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 2011-06-22
      • 2013-12-05
      • 2012-08-07
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2014-01-25
      相关资源
      最近更新 更多