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
在幕后的实际工作方式):
- 通过
open
for POSIX or CreateFile
为 Windows 打开两个文件句柄。一个句柄打开用于读取(源文件),另一个打开用于写入(目标文件)。
- 从您为读入临时缓冲区而打开的句柄中读取(
BUFSIZ
缓冲区大小通常就足够了)。
- 将缓冲区中的数据写入为写入而打开的句柄。
- 重复直到可读句柄中有可用字节。
这是它通常的工作方式,尽管 OS-特定例程可能会用一些黑魔法进行调整(例如,它们可以执行内存映射,将文件从一个描述符发送到另一个描述符而不退出内核模式,等)。
您需要提供文件名:
bool X = CopyFile(L"test.txt", L"C:\test.txt", 1);
所以,在开始之前,我一直在研究(不仅是在 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
在幕后的实际工作方式):
- 通过
open
for POSIX orCreateFile
为 Windows 打开两个文件句柄。一个句柄打开用于读取(源文件),另一个打开用于写入(目标文件)。 - 从您为读入临时缓冲区而打开的句柄中读取(
BUFSIZ
缓冲区大小通常就足够了)。 - 将缓冲区中的数据写入为写入而打开的句柄。
- 重复直到可读句柄中有可用字节。
这是它通常的工作方式,尽管 OS-特定例程可能会用一些黑魔法进行调整(例如,它们可以执行内存映射,将文件从一个描述符发送到另一个描述符而不退出内核模式,等)。
您需要提供文件名:
bool X = CopyFile(L"test.txt", L"C:\test.txt", 1);