C++ 将文件从一个目录移动到另一个目录
我想将所有文件从test1复制到test2。代码编译了,但什么也没发生C++ 将文件从一个目录移动到另一个目录,c++,winapi,C++,Winapi,我想将所有文件从test1复制到test2。代码编译了,但什么也没发生 #include <iostream> #include <stdlib.h> #include <windows.h> using namespace std; int main() { string input1 = "C:\\test1\\"; string input2 = "C:\\test2\\"; MoveFile(input1.c_str(),
#include <iostream>
#include <stdlib.h>
#include <windows.h>
using namespace std;
int main()
{
string input1 = "C:\\test1\\";
string input2 = "C:\\test2\\";
MoveFile(input1.c_str(), input2.c_str());
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
字符串input1=“C:\\test1\\”;
字符串input2=“C:\\test2\\”;
MoveFile(input1.c_str(),input2.c_str());
}
我正在考虑xcopy,但它不接受预定义的字符串。有解决方法吗?std::string GetLastErrorAsString()
std::string GetLastErrorAsString()
{
//Get the error message, if any.
DWORD errorMessageID = ::GetLastError();
if (errorMessageID == 0)
return std::string(); //No error message has been recorded
LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
std::string message(messageBuffer, size);
//Free the buffer.
LocalFree(messageBuffer);
return message;
}
int main()
{
string input1 = "C:\\test1\\";
string input2 = "C:\\test2\\";
if (!MoveFile(input1.c_str(), input2.c_str()))
{
string msg = GetLastErrorAsString();
cout << "fail: " << msg << endl;
}
else {
cout << "ok" << endl;
}
system("pause");
}
{
//获取错误消息(如果有)。
DWORD errorMessageID=::GetLastError();
如果(errorMessageID==0)
return std::string();//未记录任何错误消息
LPSTR messageBuffer=nullptr;
size_t size=FormatMessageA(格式化_消息_分配|格式化_消息|来自|系统|格式化_消息_忽略|插入,
NULL,errorMessageID,MAKELANGID(LANG_中立,SUBLANG_默认),(LPSTR)和messageBuffer,0,NULL);
std::字符串消息(messageBuffer,size);
//释放缓冲区。
LocalFree(messageBuffer);
返回消息;
}
int main()
{
字符串input1=“C:\\test1\\”;
字符串input2=“C:\\test2\\”;
如果(!MoveFile(input1.c_str(),input2.c_str()))
{
字符串msg=GetLastErrorAsString();
我通过从test2中删除\\解决了这个问题。test2文件夹不存在。感谢您的回复和测试代码。我认为SHFileOperation将是一个更好的选择,因为我必须将文件从软盘传输到我的C驱动器。string input1=“C:\\test1\\”;
string input2=“C:\\test2”检查MoveFile
的返回值,当您看到它表示失败时,使用GetLastError
找出原因。根据文档:“lpNewFileName
[in]文件或目录的新名称。新名称不可能存在。新文件可能在不同的文件系统或驱动器上。新目录必须在同一驱动器上。“<代码> TEST2 < /代码>目录已经存在吗?考虑使用或代替<代码> MOVELIVER()。
。如果这两个目录都是,那么您希望发生的事情就不会发生。GetLastErrorAsString()
在std::string
c'tor引发异常时泄漏内存。它还调用GetLastError()
非常晚。中发布了一个更好的实现。此外,写入std::cout
可能会间接导致GetLastError()
重置。如果MoveFile()
成功,则调用GetLastError()
没有意义。只有在MoveFile()成功时,才必须调用GetLastError()
失败,在调用任何其他Win32 API函数之前必须这样做,例如:如果(!MoveFile(input1.c_str(),input2.c_str()){string msg=GetLastErrorAsString();cout@RemyLebeau感谢您指出这一点,我用it@IInspectable很好,我已经看过你的链接,肯定会更新这个答案(还有我自己的GetLastError函数)使用它(但很可能是明天),我会使用一个简单的std::vector
或者甚至是一个固定大小的数组,而不是带有自定义删除器的std::unique\u ptr
。你不必让FormatMessage()
分配缓冲区内存。但是如果你这样做了,你可以(即使在Windows 10上,尽管文档中有警告)。您不需要使用lambda来委托到HeapFree()
。