(C++) 我的 CopyFile() 函数不起作用,但我的路径和参数类型似乎没问题
(C++) My CopyFile() function doesn't work, but my paths and parameter types seem to be ok
我正在尝试编写一个函数,将当前 运行 程序的 .exe
文件复制到 Windows 的 Startup
文件夹。我对此完全陌生,所以不要生我的气 :D
我有这段代码:
void startup()
{
std::string str = GetClipboardText();
wchar_t buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
std::wstring stemp = std::wstring(str.begin(), str.end());
LPCWSTR sw = stemp.c_str();
int a;
if (CopyFile(buffer, sw, true))
a = 1;
else a = 0;
}
在这里,我获取了路径并将它们保存在 buffer
中(例如 D:\source\Project2\Debug\Project2.exe
,我检查了这是否是正确的路径,如果我将 buffer
包含的内容粘贴到文件资源管理器中,它运行正确的 .exe
文件)和 sw
(如 C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
)。但它不复制,简单的 if
检查显示 a=0
.
我认为它可能没有将文件复制到 Startup
文件夹的权限,但它也不适用于其他“测试”文件夹。
CopyFile()
从一个文件复制到另一个文件。所以 lpExistingFileName
和 lpNewFileName
参数都必须给出 file 路径,但是你传递的是 folder 路径lpNewFileName
参数。那是行不通的。
您是否遵循了文档中的说明:
If the function fails, the return value is zero. To get extended error information, call GetLastError.
GetLastError()
会告诉您您的输入不可接受。
因此,要解决此问题,您必须提取源文件名并将其连接到目标文件夹路径中,例如:
std::wstring GetClipboardUnicodeText()
{
// get clipboard text using CF_UNICODETEXT, return as std::wstring...
}
void startup()
{
std::wstring str = GetClipboardUnicodeText();
WCHAR src[MAX_PATH] = {};
GetModuleFileNameW(NULL, src, MAX_PATH);
WCHAR dest[MAX_PATH] = {};
PathCombineW(dest, str.c_str(), PathFindFileNameW(src));
int a = CopyFileW(src, dest, TRUE);
}
否则,要在不指定目标文件名的情况下将文件复制到文件夹中,请改用 SHFileOperation()
,例如:
void startup()
{
// note the extra null terminator!
std::wstring dest = GetClipboardUnicodeText() + L'[=11=]';
// note +1 for the extra null terminator!
WCHAR src[MAX_PATH+1] = {};
GetModuleFileNameW(NULL, src, MAX_PATH);
SHFILEOPSTRUCTW op = {};
op.wFunc = FO_COPY;
op.pFrom = src;
op.pTo = dest.c_str();
op.fFlags = FOF_FILESONLY;
int a = SHFileOperationW(&op);
}
我正在尝试编写一个函数,将当前 运行 程序的 .exe
文件复制到 Windows 的 Startup
文件夹。我对此完全陌生,所以不要生我的气 :D
我有这段代码:
void startup()
{
std::string str = GetClipboardText();
wchar_t buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
std::wstring stemp = std::wstring(str.begin(), str.end());
LPCWSTR sw = stemp.c_str();
int a;
if (CopyFile(buffer, sw, true))
a = 1;
else a = 0;
}
在这里,我获取了路径并将它们保存在 buffer
中(例如 D:\source\Project2\Debug\Project2.exe
,我检查了这是否是正确的路径,如果我将 buffer
包含的内容粘贴到文件资源管理器中,它运行正确的 .exe
文件)和 sw
(如 C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
)。但它不复制,简单的 if
检查显示 a=0
.
我认为它可能没有将文件复制到 Startup
文件夹的权限,但它也不适用于其他“测试”文件夹。
CopyFile()
从一个文件复制到另一个文件。所以 lpExistingFileName
和 lpNewFileName
参数都必须给出 file 路径,但是你传递的是 folder 路径lpNewFileName
参数。那是行不通的。
您是否遵循了文档中的说明:
If the function fails, the return value is zero. To get extended error information, call GetLastError.
GetLastError()
会告诉您您的输入不可接受。
因此,要解决此问题,您必须提取源文件名并将其连接到目标文件夹路径中,例如:
std::wstring GetClipboardUnicodeText()
{
// get clipboard text using CF_UNICODETEXT, return as std::wstring...
}
void startup()
{
std::wstring str = GetClipboardUnicodeText();
WCHAR src[MAX_PATH] = {};
GetModuleFileNameW(NULL, src, MAX_PATH);
WCHAR dest[MAX_PATH] = {};
PathCombineW(dest, str.c_str(), PathFindFileNameW(src));
int a = CopyFileW(src, dest, TRUE);
}
否则,要在不指定目标文件名的情况下将文件复制到文件夹中,请改用 SHFileOperation()
,例如:
void startup()
{
// note the extra null terminator!
std::wstring dest = GetClipboardUnicodeText() + L'[=11=]';
// note +1 for the extra null terminator!
WCHAR src[MAX_PATH+1] = {};
GetModuleFileNameW(NULL, src, MAX_PATH);
SHFILEOPSTRUCTW op = {};
op.wFunc = FO_COPY;
op.pFrom = src;
op.pTo = dest.c_str();
op.fFlags = FOF_FILESONLY;
int a = SHFileOperationW(&op);
}