1

“myfile.doc”与 c++ 可执行文件位于同一目录中。但这给了我一个错误代码2!

CopyFile("myfile.doc","C:\\Destination\\myfile.doc",0);
4

3 回答 3

1

您不应该依赖使用相对路径。而是首先构造一个完全限定的路径名​​。首先检索可执行文件的完全限定路径。GetModuleFileName是要走的路:

TCHAR path[MAX_PATH] = {0};
GetModuleFileName(NULL, path, MAX_PATH);

要构造要复制的文件的完全限定路径名,您需要去掉可执行文件的文件名并附加您的文件名。Shell 轻量级实用程序库提供PathRemoveFileSpecPathAppend

PathRemoveFileSpec(path);
PathAppend(path, _T("myfile.doc"));

此时,path保存文件的完全限定路径名myfile.doc,准备好在调用CopyFile.

请注意,此实现仅限于长度为MAX_PATH(260) 个字符的路径名。另请注意,两个 SHLW 调用已被弃用,取而代之的是更安全的替代方案PathCchRemoveFileSpecPathCchApend. 概念保持不变;为简洁起见,我使用了已弃用的 API 调用。

于 2013-10-15T22:44:20.677 回答
1

当前目录与可执行文件所在的目录不同。您想GetModuleFileName用 a调用NULL HMODULE以获取其路径。

更新:既然您问了,这是一个快速而肮脏的示例,省略了所有错误检查(因为您的代码示例使用 ANSI 字符串,我将坚持使用TCHAR,正如我在评论中所说的一般,我发现留在WCHARPWSTR无处不在并编译更容易统一码):

#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
}
于 2013-10-15T22:17:23.027 回答
0

您是否正在从 VS 运行应用程序?IDE-s 经常根据项目属性更改应用程序的工作目录。尝试在 VS 之外运行应用程序。

于 2013-10-15T22:19:58.057 回答