C++ 将文件从一个目录移动到另一个目录

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(),

我想将所有文件从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(), 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()