从 c++ 中的当前目录复制文件(Windows API)
CopyFile from current directory in c++ (windows API)
>"myfile.doc"与 C++ 可执行文件位于同一目录中。但这给了我一个错误代码 2!
CopyFile("myfile.doc","C:\Destination\myfile.doc",0);
您不应该依赖使用相对路径。而是先构造一个完全限定的路径名。首先检索可执行文件的完全限定路径。 GetModuleFileName
是要走的路:
TCHAR path[MAX_PATH] = {0};
GetModuleFileName(NULL, path, MAX_PATH);
要构造要复制的文件的完全限定路径名,您需要去除可执行文件的文件名并附加文件名。壳牌轻量级实用程序库提供PathRemoveFileSpec
和PathAppend
:
PathRemoveFileSpec(path);
PathAppend(path, _T("myfile.doc"));
此时,path
持有文件myfile.doc
的完全限定路径名,准备用于对CopyFile
的调用。
请注意,此实现仅限于长度为 MAX_PATH
(260) 个字符的路径名。另请注意,两个 SHLW 调用都已被弃用,转而支持更安全的替代方案PathCchRemoveFileSpec
和PathCchApend
。概念保持不变;为了简洁起见,我使用了已弃用的 API 调用。
当前目录与可执行文件的目录不同。 您希望使用NULL
HMODULE
调用GetModuleFileName
以获取其路径。
更新:既然你问了,这里有一个快速而肮脏的例子,省略了所有错误检查(因为你的代码示例使用 ANSI 字符串,我会坚持TCHAR
,正如我在评论中所说的那样,我发现更容易在任何地方停留WCHAR
或PWSTR
并编译为 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之外运行应用程序。
相关文章:
- 如何使用Windows API C++更改已创建的文件夹/目录安全权限
- C++Windows API MOUSEEVENTF_XDOWN,MOUSEEVENTF_XUP不起作用
- 如何在 Windows API 中更改系统范围的多个游标
- 为什么我在 Windows API 中得到对 TextOut() 函数的未定义引用?
- 谁拥有作为指向 Windows API 函数的指针传递的值?
- 使用 Windows API c++ 的键盘输入
- 程序在对mouse_event的 Windows API 调用中冻结
- 等效的Windows API与Power shell get-physicaldisk命令
- 需要更好地了解使用 Windows API 的智能指针
- 如何检查 CNG Windows API 是否返回符合 FIPS 的算法实现
- Windows API SIZE_T在内存和控制台中不显示相同的值
- 如何在 Windows API 中检测带有虚拟代码的非字母?
- c ++ 是否有任何用于列出 Windows 驱动程序管理器控制台中显示的设备驱动程序的 Windows API?
- Windows API "CreateWindowEx" 在 Python (3.6.8) 64 位使用的 DLL 中工作吗?
- 如何将CString转换为使用WCHAR的Windows API和自定义函数?
- 如何通过Windows API获取所有(未禁用)用户SID?
- 有什么方法可以用本机C 代码替换Windows API计时器(settimer)
- 检查任务栏中的当前应用程序吗?(C ,Windows API)
- 为什么我的 Windows API 回调函数不运行?
- 如何在应用程序正在运行的系统上查看所需的Windows API函数