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

时间:2015-12-27 20:46:51

标签: c++ windows winapi file-copying

所以,在开始之前,我一直在研究(不仅仅是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()返回3 - 这意味着ERROR_PATH_NOT_FOUND - 但是,相信我,我检查了每个文件(test.txt与构建的.exe位于同一个地方,我作为管理员运行... )它仍然给出了3。

我无法让它发挥作用。请注意 L “test”这是因为我使用Visual Studio进行了某些字符集设置,我试图更改该配置并使用“test.txt” - &gt;仍然是错误3。

3 个答案:

答案 0 :(得分:2)

您需要提供文件名:

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

答案 1 :(得分:1)

您可以查看MSDN:

中的功能签名
BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

我想,它不需要目标目录(例如cp命令),而是整个文件名。提示:确保在调用CopyFile时创建最终文件名之前的所有目录。

另一个提示:在POSIX系统上,你没有类似的例程(嗯,你在OS X上有类似的东西,但它是特定于操作系统的)。但是,这里有你可以做的事情(这就是CopyFile实际在幕后工作的方式):

  1. 通过open为POSIX打开两个文件句柄,或为CreateFile打开Windows。打开一个句柄进行读取(源文件),打开另一个句柄进行写入(目标文件)。
  2. 从您打开的用于读入临时缓冲区的句柄中读取(BUFSIZ缓冲区大小通常就足够了。)
  3. 将数据从缓冲区写入为打开而打开的句柄。
  4. 重复,直到可读句柄中有可用的字节。
  5. 这是它通常的工作方式,虽然特定于操作系统的例程可以通过一些黑魔法进行调整(例如,它们可以执行内存映射,将文件从一个描述符发送到另一个描述符而不退出内核模式等)。

答案 2 :(得分:0)

尝试:

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