CopyFile 失败,错误代码 3 (ERROR_PATH_NOT_FOUND)

CopyFile fails with error code 3 (ERROR_PATH_NOT_FOUND)

所以,在开始之前,我一直在研究(不仅是在 Stack Overflow 上),但我找不到解决我问题的方法。

我正在尝试使用 Windows' CopyFile 函数将文件复制到某个位置(如果可能,在复制它的同时更改其名称)。

我创建了一个示例程序来显示错误。

#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
    cout << "Copy in progress" << endl;
    bool X = CopyFile(L"test.txt", L"C:\", 1); //NOT C: nor C:\ 
    if (!X){ cout << "FALLO AL COPIAR\n"; cout << "Error: "<<GetLastError();}
    else{ cout << "COPIADO CORRECTO";  }
    cin.get(); cin.get();
    return 0;
}

GetLastError() returns 3 - 这意味着 ERROR_PATH_NOT_FOUND - 但是,相信我,我已经检查了每个文件(test.txt 与构建的位置相同.exe,我是 运行 作为管理员...)它仍然给出 3.

我无法让它工作。注意 L"test" 这样做是因为我使用 Visual Studio 和某些字符集设置,我试图更改该配置并使用 "test.txt" -> 仍然是错误 3.

尝试:

CopyFile(L"test.txt", L"C:\test.txt", 1);

您可以从 MSDN:

查看函数签名
BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

我想,它不需要目标目录(例如 cp 命令),而是整个文件名。提示:确保在调用 CopyFile.

时创建了最终文件名之前的所有目录

还有一个提示:在 POSIX 系统上,您没有类似的例程(好吧,您在 OS X 上有类似的东西,但它是 OS 特定的)。但是,您可以执行以下操作(这就是 CopyFile 在幕后的实际工作方式):

  1. 通过 open for POSIX or CreateFile 为 Windows 打开两个文件句柄。一个句柄打开用于读取(源文件),另一个打开用于写入(目标文件)。
  2. 从您为读入临时缓冲区而打开的句柄中读取(BUFSIZ 缓冲区大小通常就足够了)。
  3. 将缓冲区中的数据写入为写入而打开的句柄。
  4. 重复直到可读句柄中有可用字节。

这是它通常的工作方式,尽管 OS-特定例程可能会用一些黑魔法进行调整(例如,它们可以执行内存映射,将文件从一个描述符发送到另一个描述符而不退出内核模式,等)。

您需要提供文件名:

bool X = CopyFile(L"test.txt", L"C:\test.txt", 1);