我試圖在Windows中實現dd等效功能。 [澄清:我試圖複製dd的=/dev/hdb =/dev/hdb功能,以便將Windows安裝遷移到更大的HD。奇怪的是,我現在已經成功地使用了這種方法。 - G]ReadFile在PhysicalDrive結束時不發送EOF信號
該程序工作(我結束了源數據複製到目標磁盤),但不會自行終止 - 我必須叮噹它,一旦我確定整個源磁盤已被讀取。
我在CreateFile調用中使用「\\。\ PhysicalDriveX」語法打開和鎖定源和目標物理驅動器沒有問題。
我的問題是成功檢測源驅動器數據的結束。
// doesn't work - won't detect End-of-valid drive data and reads endlessly
while ((success = ReadFile(hInfile, buffer, BUFSIZE, &nRead, NULL)) && nRead != 0) {
// ... write the data to the target drive; break if it fails.
// ... write a progress indicator to the console
}
// should execute but never does
if (! success) {
// an error occurred, do cleanup.
}
else {
// all done, unlock & close filehandles
puts("ta da!");
}
EOF爲「正常」文件(IO同步期間),通過信號發送的ReadFile返回TRUE,但字節的讀取(NREAD)的數量設置爲0:
目前我使用讀32K組塊這是我在笨拙的while()語句中嘗試的。
ReadFile似乎一旦讀取了源物理驅動器上有效數據的末尾後,就會返回空字節塊。
知道何時停止閱讀的正確方法是什麼? - 我應該在開始之前使用IOCTL_DISK_GET_LENGTH_INFO嗎?它看起來有點多餘,因爲ReadFile應該在讀取磁盤末尾時報告EOF(或失敗)。
在此先感謝。
嗯,我不確定這件事。根據SDK文檔,如果ReadFile返回FALSE,則只需要調用GetLastError,並且僅在執行OVERLAPPED IO時才需要檢測EOF。我的ReadFile調用的最後一個參數是一個NULL指針;我正在執行同步IO。 – Gerard