2017-03-01 315 views
0

我想將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()); 
} 

我在考慮xcopy,但它不接受預定義的字符串。有沒有解決辦法?

+3

檢查'MoveFile'的返回值,當你看到它說失敗時,使用'GetLastError'找出原因。 –

+2

根據['MoveFile()'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365239.aspx)文檔:「*'lpNewFileName' [in] 文件或目錄**新名稱不能存在**新文件可能位於不同的文件系統或驅動器上新的目錄必須位於同一個驅動器上*「test2'目錄是否已存在?考慮使用['SHFileOperation()'](https://msdn.microsoft.com/en-us/library/windows/desktop/bb762164.aspx)或['IFileOperation'](https://msdn.microsoft.com /en-us/library/windows/desktop/bb775771.aspx)而不是'MoveFile()'。 –

+0

如果這些都是目錄,那麼你希望發生的事情不會。 –

回答

1
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"); 
} 

您的代碼工作對我來說,你可能要設置的字符在你的項目屬性設置爲use multi-byte character set。 如果沒有,請向我們提供錯誤。 檢查您是否擁有C:上的寫權限。 檢查C:中是否已有test2文件夾:(或C:中沒有test1文件夾:)。

+0

'GetLastErrorAsString()'在'std :: string' c'tor引發異常的情況下泄漏內存。它還很晚地調用'GetLastError()'。在[本文檔主題]中已經發布了更好的實現(http://stackoverflow.com/documentation/winapi/2573/error-reporting-and-handling/9378/)。 – IInspectable

+0

此外,寫入'std :: cout'可能會間接導致'GetLastError()'重置。如果MoveFile()成功,調用'GetLastError()'是沒有意義的。只有當MoveFile()失敗時,你必須調用GetLastError(),並且必須在調用其他Win32 API函數之前調用GetLastError(),例如:if(!MoveFile(input1.c_str(),input2.c_str()) ){string msg = GetLastErrorAsString(); cout <<「失敗:」<< msg << endl; } else {cout <<「ok」<< endl; }' –

+0

@RemyLebeau謝謝你指出這一點,我用它編輯了答案 – user

0

我通過從test2刪除\\解決了該問題。文件夾測試2不存在。感謝您的答覆和測試代碼。我認爲SHFileOperation將是一個更好的選擇,因爲我必須將文件從軟盤傳輸到C驅動器。 string input1 =「C:\\ test1 \\」; string input2 =「C:\\ test2」;

相關問題