Winapi 如何使用IFileOperation删除文件并将其发送到Vista/7中的回收站?

Winapi 如何使用IFileOperation删除文件并将其发送到Vista/7中的回收站?,winapi,Winapi,根据的文档,Windows 8中引入了FOFX\u RECYCLEONDELETE标志 我想删除文件并将其发送到回收站。如何在Vista和Windows 7中使用IFileOperation实现这一点 我知道SHFileOperation支持该功能,但我不想使用SHFileOperation,因为Microsoft告诉我们要使用IFileOperation。是否可以使用IFileOperation,如果可以,如何实现 FOFX_RECYCLEONDELETE标志是在Win 8中引入的-它在Vis

根据的文档,Windows 8中引入了
FOFX\u RECYCLEONDELETE
标志

我想删除文件并将其发送到回收站。如何在Vista和Windows 7中使用
IFileOperation
实现这一点

我知道
SHFileOperation
支持该功能,但我不想使用
SHFileOperation
,因为Microsoft告诉我们要使用
IFileOperation
。是否可以使用
IFileOperation
,如果可以,如何实现

FOFX_RECYCLEONDELETE标志是在Win 8中引入的-它在Vista/7中可以工作吗

由于Windows 8中引入了
FOFX\u RECYCLEONDELETE
,因此它在Vista/7中不存在,因此不会在这些版本中工作

总是有SHFileOperation,但我更愿意使用更为最新的Win32 API方法。还有什么要知道的吗?有其他回收文件/文件夹的方法吗

SHFileOperation()
是回收文件/文件夹的唯一有文档记录的方法:

当用于删除文件时,除非在lpFileOp指向的SHFILEOPSTRUCT结构的fFlags成员中设置FOF_ALLOWUNDO标志,否则SHFileOperation将永久删除该文件设置该标志将文件发送到回收站。如果您只想删除一个文件并保证它不会被放入回收站,请使用DeleteFile

相同的标志在
IFileOperation
中可用,但其记录的行为不同:

如果可能,请保留撤消信息

在Windows Vista之前,只能从执行原始操作的同一进程中撤消操作

在Windows Vista和更高版本的系统中,撤消的范围是用户会话。用户会话中运行的任何进程都可以撤消另一个操作撤销状态保存在Explorer.exe进程中,只要该进程正在运行,它就可以协调撤销功能


这就是为什么必须引入
FOFX\u RECYCLEONDELETE
——以重新添加在首次引入
IFileOperation
时丢失的旧回收站行为。

SetOperationFlags
的文档说明:

此成员可以是以下标志的组合。FOF标志在Shellapi.h中定义,FOFX标志在Shobjidl.h中定义


因此,您可以使用与
SHFileOperation
一起使用的完全相同的标志,
FOF_ALLOWUNDO
,来引导删除操作移动到回收站

我已经核实了David Heffernan对FOF_ALLOWUNDO标志与IFileOperation一起用于将物品发送到回收站的评估。这是密码。显然,SHCreateItemFromParsingName是MS表示从字符串创建项的方式。这个代码是用QT迎合C++的。当然,您必须首先初始化COM

void Worker::deleteItem(QString item)
{
    HRESULT hr;
    IFileOperation *pfo;

    wchar_t *itemWChar = new wchar_t[item.length()+1];
    item.toWCharArray(itemWChar);
    itemWChar[item.length()] = 0;
    PCWSTR itemPCWSTR = itemWChar;

    hr = CoCreateInstance(CLSID_FileOperation,
                          NULL,
                          CLSCTX_ALL,
                          //IID_IFileOperation,
                          IID_PPV_ARGS(&pfo));
    if (!SUCCEEDED(hr))
    {
        //error handling here
        return;
    }

    hr = pfo->SetOperationFlags(FOF_ALLOWUNDO | FOF_NOCONFIRMATION);
    if (!SUCCEEDED(hr))
    {
        //error handling here
        return;
    }

    IShellItem *deleteItem = NULL;
    hr = SHCreateItemFromParsingName(itemPCWSTR,
                                     NULL,
                                     IID_PPV_ARGS(&deleteItem));
    if (!SUCCEEDED(hr))
    {
        //error handling here
        return;
    }

    hr = pfo->DeleteItem(deleteItem,NULL);

    if (deleteItem != NULL)
    {
        deleteItem->Release();
    }


    if (!SUCCEEDED(hr))
    {
        //error handling here
        return;
    }

    hr = pfo->PerformOperations();

    if (!SUCCEEDED(hr))
    {
        //error handling here
        return;
    }

    pfo->Release();

    delete[] itemWChar;
}

我不明白这个问题。谢谢你的回答。对于微软来说,引入一个替换功能似乎是违反直觉的,它的功能比被替换的功能要少,即用于将项目发送到回收站,这就是我提出这个问题的原因。由于IFIleOperation无法回收Vista和7…@Josh,这是违反直觉的,因为事实并非如此
FOF_ALLOWUNDO
IFileOperation
配合使用,就像它与
SHFileOperation
@Remy配合使用一样,我怀疑文档是不可靠的。很难看出在没有回收站的情况下,如何在删除操作上实现撤消。除了
FOF_ALLOWUNDO
没有记录在
IFileOperation
中,仅在
SHFileOperation
中以任何方式涉及回收站。事实上,对于
IFileOperation
,它被记录为根本不在回收站中存储数据,而是在Explorer.exe中存储,因此必须添加
FOFX\u RECYCLEONDELETE
才能恢复回收站行为。@RemyLebeau事实上并非如此。文件不准确
FOF_ALLOWUNDO
的工作原理与往常一样。注意:我已经测试过了。当然,这一切都引出了一个问题,那就是为什么要引入
FOFX\u RECYCLEONDELETE
。我想如果您正在执行一系列包括删除文件在内的操作,您可能希望将文件放入回收站,但您更愿意这样做,而不需要同时撤消所有其他操作的开销?不知道在实践中会出现多少次。@DavidHefferman您有可以粘贴的示例代码吗?我在谷歌上找不到多少东西。。。Windows开发中心的示例有点不完整,到处都缺少参数。