【问题标题】:SHFileOperation error 87SHFileOperation 错误 87
【发布时间】:2017-07-22 03:45:58
【问题描述】:

我正在尝试将 A 驱动器的内容复制到文件夹 C:\test\disk1。文件夹 disk1 已存在。程序编译但运行时出现错误 87。我知道错误 87 与无效参数有关,但我不确定问题出在哪里。有人有什么想法吗?

#include <Windows.h>
#include <stdio.h>

int main(int argc, char ** argv)
{
    const wchar_t *const sourceFile = L"A:\\";
    const wchar_t *const outputFile = L"C:\\test\\disk1";

    SHFILEOPSTRUCTW fileOperation;
    memset(&fileOperation, 0, sizeof(SHFILEOPSTRUCTW));

    fileOperation.wFunc = FO_COPY;
    fileOperation.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR |
                               FOF_NOERRORUI | FOF_FILESONLY;
    fileOperation.pFrom = sourceFile;
    fileOperation.pTo = outputFile;

    int result = SHFileOperationW(&fileOperation);
    if (result != 0)
    {
        printf("SHFileOperation Failure: Error%u\n", result);
        return 1;
    }

    memset(&fileOperation, 0, sizeof(SHFILEOPSTRUCTW));

    printf("OK\n");
    return 0;
}

【问题讨论】:

    标签: c++ winapi shfileoperation


    【解决方案1】:

    注意SHFILEOPSTRUCT 的文档,尤其是pFrompTo 的文档:

      PCZZTSTR     pFrom;
      PCZZTSTR     pTo;
    

    PCZZTSTR 是什么意思?

    pFrom
    Type: PCZZTSTR
    Note  This string must be double-null terminated.
    

    所以你的解决办法是提供一个额外的尾随零。

    const wchar_t *const sourceFile = L"A:\\\0";
    const wchar_t *const outputFile = L"C:\\test\\disk1\0";
    

    请注意,Windows API 函数接受 / 作为目录分隔符,因此可以写成更容易阅读:

    const wchar_t *const sourceFile = L"A:/\0";
    const wchar_t *const outputFile = L"C:/test/disk1\0";
    

    PCZZSTR 实际上是一个指向以空字符串结尾的零终止字符串列表的指针。)

    【讨论】:

    • 文件 I/O API 有时会将正斜杠转换为反斜杠,有时则不会。 Windows 上的路径分隔符是反斜杠。建议使用“错误”分隔符来提高可读性是有问题的。如果这是关于可读性,您可以改用L"A:\\" L"\0"L"C:\\test\\disk1" L"\0"
    • @RobbieJ:这是一个单独的问题。请这样问。 (并注意 IInspectable 添加的标签。)
    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多