(C++) 我的 CopyFile() 函数不起作用,但我的路径和参数类型似乎没问题

(C++) My CopyFile() function doesn't work, but my paths and parameter types seem to be ok

我正在尝试编写一个函数,将当前 运行 程序的 .exe 文件复制到 Windows 的 Startup 文件夹。我对此完全陌生,所以不要生我的气 :D

我有这段代码:

void startup()
{
    std::string str = GetClipboardText();
    wchar_t buffer[MAX_PATH];
    GetModuleFileName(NULL, buffer, MAX_PATH);
    std::wstring stemp = std::wstring(str.begin(), str.end());
    LPCWSTR sw = stemp.c_str();
    int a;
    if (CopyFile(buffer, sw, true))
        a = 1;
    else a = 0;
}

在这里,我获取了路径并将它们保存在 buffer 中(例如 D:\source\Project2\Debug\Project2.exe,我检查了这是否是正确的路径,如果我将 buffer 包含的内容粘贴到文件资源管理器中,它运行正确的 .exe 文件)和 sw(如 C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)。但它不复制,简单的 if 检查显示 a=0.

我认为它可能没有将文件复制到 Startup 文件夹的权限,但它也不适用于其他“测试”文件夹。

CopyFile() 从一个文件复制到另一个文件。所以 lpExistingFileNamelpNewFileName 参数都必须给出 file 路径,但是你传递的是 folder 路径lpNewFileName 参数。那是行不通的。

您是否遵循了文档中的说明:

If the function fails, the return value is zero. To get extended error information, call GetLastError.

GetLastError() 会告诉您您的输入不可接受。

因此,要解决此问题,您必须提取源文件名并将其连接到目标文件夹路径中,例如:

std::wstring GetClipboardUnicodeText()
{
    // get clipboard text using CF_UNICODETEXT, return as std::wstring...
}

void startup()
{
    std::wstring str = GetClipboardUnicodeText();

    WCHAR src[MAX_PATH] = {};
    GetModuleFileNameW(NULL, src, MAX_PATH);

    WCHAR dest[MAX_PATH] = {};
    PathCombineW(dest, str.c_str(), PathFindFileNameW(src));

    int a = CopyFileW(src, dest, TRUE);
}

否则,要在不指定目标文件名的情况下将文件复制到文件夹中,请改用 SHFileOperation(),例如:

void startup()
{
    // note the extra null terminator!
    std::wstring dest = GetClipboardUnicodeText() + L'[=11=]';

    // note +1 for the extra null terminator!
    WCHAR src[MAX_PATH+1] = {};
    GetModuleFileNameW(NULL, src, MAX_PATH);

    SHFILEOPSTRUCTW op = {};
    op.wFunc = FO_COPY;
    op.pFrom = src;
    op.pTo = dest.c_str();
    op.fFlags = FOF_FILESONLY;

    int a = SHFileOperationW(&op);
}