“myfile.doc”与 c++ 可执行文件位于同一目录中。但这给了我一个错误代码2!
CopyFile("myfile.doc","C:\\Destination\\myfile.doc",0);
“myfile.doc”与 c++ 可执行文件位于同一目录中。但这给了我一个错误代码2!
CopyFile("myfile.doc","C:\\Destination\\myfile.doc",0);
您不应该依赖使用相对路径。而是首先构造一个完全限定的路径名。首先检索可执行文件的完全限定路径。GetModuleFileName
是要走的路:
TCHAR path[MAX_PATH] = {0};
GetModuleFileName(NULL, path, MAX_PATH);
要构造要复制的文件的完全限定路径名,您需要去掉可执行文件的文件名并附加您的文件名。Shell 轻量级实用程序库提供PathRemoveFileSpec
和PathAppend
:
PathRemoveFileSpec(path);
PathAppend(path, _T("myfile.doc"));
此时,path
保存文件的完全限定路径名myfile.doc
,准备好在调用CopyFile
.
请注意,此实现仅限于长度为MAX_PATH
(260) 个字符的路径名。另请注意,两个 SHLW 调用已被弃用,取而代之的是更安全的替代方案PathCchRemoveFileSpec
和PathCchApend
. 概念保持不变;为简洁起见,我使用了已弃用的 API 调用。
当前目录与可执行文件所在的目录不同。您想GetModuleFileName
用 a调用NULL
HMODULE
以获取其路径。
更新:既然您问了,这是一个快速而肮脏的示例,省略了所有错误检查(因为您的代码示例使用 ANSI 字符串,我将坚持使用TCHAR
,正如我在评论中所说的一般,我发现留在WCHAR
或PWSTR
无处不在并编译更容易统一码):
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(X) (sizeof(X) / sizeof(*X))
#endif
// ISSUE - would be cleaner to do this on heap without artificial size limits
TCHAR Buffer[MAX_PATH];
PTSTR LastSlash;
if (!GetModuleFileName(NULL, Buffer, ARRAY_SIZE(Buffer)))
{
// TODO - handle error
}
LastSlash = _tcsrchr(Buffer, _T('\\'));
if (!LastSlash)
{
// TODO - this shouldn't happen. treat it as an error.
}
LastSlash++;
TCHAR ToAppend[] = _T("myfile.doc");
if (ARRAY_SIZE(ToAppend) > ARRAY_SIZE(Buffer) - (LastSlash - Buffer))
{
// TODO - you don't have enough space, this is an error
}
memcpy(LastSlash, ToAppend, sizeof(ToAppend));
if (!CopyFile(Buffer,_T("C:\\Destination\\myfile.doc"),0))
{
// TODO - this is an error
}
您是否正在从 VS 运行应用程序?IDE-s 经常根据项目属性更改应用程序的工作目录。尝试在 VS 之外运行应用程序。