2012-11-08 107 views
0

我正在編寫一個用於備份某些指定文件的應用程序,因此使用備份API調用即CreateFile BackupRead和WriteFile API的如何在C++中使用備份API進行備份

獲取錯誤訪問衝突讀取位置。

我附上下面的代碼。

#include <windows.h> 

int main() 
{ 
    HANDLE hInput, hOutput; 

//m_filename is a variable holding the file path to read from 
hInput = CreateFile(L"C:\\Key.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); 

//strLocation contains the path of the file I want to create. 
hOutput= CreateFile(L"C:\\tmp\\", GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, NULL, NULL); 


DWORD dwBytesToRead = 1024 * 1024 * 10; 
BYTE *buffer; 
buffer = new BYTE[dwBytesToRead]; 
BOOL bReadSuccess = false,bWriteSuccess = false; 
DWORD dwBytesRead,dwBytesWritten; 
LPVOID lpContext; 
//Now comes the important bit: 

do 
{ 
    bReadSuccess = BackupRead(hInput, buffer, sizeof(BYTE) *dwBytesToRead, &dwBytesRead, false, true, &lpContext); 

    bWriteSuccess= WriteFile(hOutput, buffer, sizeof(BYTE) *dwBytesRead, &dwBytesWritten, NULL); 

}while(dwBytesRead == dwBytesToRead); 

return 0; 

}

任何一個建議我如何使用這些API的?

謝謝。

+0

我不從Vista瘦窗戶到Windows 8將允許您創建文件在C:目錄在程序 – billz

+0

它是一個例子,目的地的位置可能是什麼... – user1603185

回答

0

閱讀文檔。具體來說,文檔爲BackupRead第二段:

您必須設置變量指向lpContextNULLBackupRead第一次調用指定的文件或目錄之前。

您的代碼也非常需要錯誤處理 - 您根本不需要檢查錯誤,實際上很多這些API可能會失敗(請查看每個API的文檔以瞭解該函數如何失敗當它失敗時會發生什麼)。您還應該實施正確的資源處理,例如通過關閉文件句柄。

+0

感謝您的回覆詹姆斯。 將lpContext設置爲NULL後,我沒有獲得訪問voilation錯誤 但是這個appln沒有備份文件。 將通過處理每個API的錯誤來處理它。 – user1603185