2011-07-29 9 views
2

Windowsでdd相当品を実装しようとしています。 [説明:ddのif/dev/hda of =/dev/hdb機能を複製しようとしています。これは、Windowsインストールをより大きなHDに移行するためです。奇妙なことに、私はこのアプローチを2〜3回成功させました。 - 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の間に)TRUEを返すが、0に読み込まれたバイト数(NREAD)を設定ReadFile関数によって通知されます:

は現在、私は使用して32Kのチャンクを読んでいますこれは私が不器用なwhile()ステートメントで試みるものです。

ReadFileは、ソースPhysicalDrive上の有効なデータの最後を読み取った後、nullバイトのブロックを返すようです。

いつ読書をいつ終了するのかを知る正しい方法はありますか? - 開始する前にIOCTL_DISK_GET_LENGTH_INFOを使用する必要がありますか? ReadFileは、ディスクの終わりを過ぎて読んだときにEOF(または失敗)を報告する必要があるため、ちょっと冗長に見えます。

ありがとうございます。

答えて

0

MSDNによれば、GetLastErrorでERROR_HANDLE_EOFを確認する必要があります。たぶんこれが役立ちます。それでも、この場合は0を返します。

+1

こんにちは、これについてはわかりません。 SDKのドキュメントによれば、ReadFileがFALSEを返す場合にのみGetLastErrorを呼び出す必要があり、OVERLAPPED IOが実行されている場合はEOFを検出するためにのみ必要です。私のReadFile呼び出しの最後のパラメータはNULLポインタです。私は同期IOを実行しています。 – Gerard

関連する問題