从 c++ 中的当前目录复制文件(Windows API)

CopyFile from current directory in c++ (windows API)

本文关键字:Windows API 文件 复制 c++ 当前目录      更新时间:2023-10-16

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

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

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

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

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

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

此时,path持有文件myfile.doc的完全限定路径名,准备用于对CopyFile的调用。

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

当前目录与可执行文件的目录不同。 您希望使用NULL HMODULE调用GetModuleFileName以获取其路径。

更新:既然你问了,这里有一个快速而肮脏的例子,省略了所有错误检查(因为你的代码示例使用 ANSI 字符串,我会坚持TCHAR,正如我在评论中所说的那样,我发现更容易在任何地方停留WCHARPWSTR并编译为 Unicode):

#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之外运行应用程序。