2017-03-02 378 views
1

我想将A驱动器的内容复制到文件夹C:\ test \ disk1中。文件夹disk1已经存在。该程序编译,但运行时,我得到错误87.我知道错误87有一个无效的参数,但我不知道问题出在哪里。有没有人有任何想法?SHFileOperation错误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; 
} 

回答

2

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实际上是指向终止零列表由空字符串终止的字符串)

+0

@IInspectable:感谢修复 –

+1

文件I/O API有时会将正斜杠转换为反斜杠,有时它们不会。 Windows上的路径分隔符是反斜杠。建议使用'错误'分隔符来提高可读性是值得怀疑的。如果这是关于可读性的,可以使用'L“A:\\”L“\ 0”'和'L“C:\\ test \\ disk1”L“\ 0”'代替。 – IInspectable

+0

@RobbieJ:这是一个单独的问题。请问这样。 (并注意IInspectable添加的标签。) –

相关问题