尝试使用MoveFile和C ++移动文件时的ERROR_INVALID_NAME

时间:2016-07-20 03:09:22

标签: c++ windows winapi io

        wstring path = L"C:\\Users\\oneworduser\\Desktop\\trash";
        LPCWSTR origin = (path + L"\\" + files.at(i)).wstring::c_str();
        LPCWSTR destination = (path + L"\\" + extensions.at(i) + L"\\" + files.at(i)).wstring::c_str();
        //move file
        BOOL b = MoveFileW(origin, destination);

MoveFileW返回false files.at(i)是当前文件的wstring名称 extensions.at(i)是追随的子字符串。在files.at(i)中。例如:
如果files.at(0)mytext.txt,则extensions.at(0)txt。 MoveFileW返回false,如果我GetLastError(),我收到错误123 ERROR_INVALID_NAME
为什么我不能移动文件?

2 个答案:

答案 0 :(得分:5)

您有未定义的行为。 std::wstring::operator+返回一个临时值,origindestination最终指向释放的内存。如果你在调试器中查看你的程序,你几乎肯定会看到这个。

将您的代码更改为:

wstring path = L"C:\\Users\\oneworduser\\Desktop\\trash";
wstring origin = path + L"\\" + files.at(i);
wstring destination = path + L"\\" + extensions.at(i) + L"\\" + files.at(i);
//move file
BOOL b = MoveFileW(origin.c_str(), destination.c_str());

答案 1 :(得分:0)

LPCWSTR origin = (path + L"\\" + files.at(i)).wstring::c_str();

这一行将创建一个匿名的wstring对象,将数据指针传递给'origin'。在这一行之后,匿名对象将是析构函数,并使'origin'指向已经空闲的内存。