2012-02-21 16 views
1

私のC++アプリケーションでは、isoファイルを非同期で​​- 重複したフラグとそれ以降 - readfileで読みとそうとしています。 しかし、このコードを単純なファイル(たとえばtxtファイル)で試してみるとうまくいきます。しかし、このコードをisoファイルで実行すると失敗します。 私はMSDNで、圧縮ファイルはreadfileの同期呼び出しでしか読み込めないことがわかりました。 isoファイルはこのカテゴリにありますか?もしそうなら、 - isoファイルを非同期で読む方法が他にありますか?Readfile async - iso files C++

int _tmain(int argc, _TCHAR* argv[]) 
{ 


HANDLE hFile; 
    DWORD NumberOfBytesRead = 0, dw; 
    BYTE *buf = (BYTE*)malloc(BUF_SIZE*sizeof(BYTE)); 
    OVERLAPPED overlapped; 
    overlapped.Offset = overlapped.OffsetHigh = 0; 
    memset(buf, 0, 1024); 

overlapped.hEvent = CreateEvent(NULL, true, false, NULL); 
if(NULL == overlapped.hEvent) 
    printf("error"); 

hFile = CreateFile("xxx.iso", 
        GENERIC_READ, 
        FILE_SHARE_READ, 
        NULL, 
        OPEN_EXISTING, 
    FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING , 
        NULL); 



if (hFile == INVALID_HANDLE_VALUE) 
     printf("invalid hfile\n"); 

    int i; 
    i= ReadFile(hFile, 
       buf, 
       BUF_SIZE, 
       &NumberOfBytesRead, 
     &overlapped); 
    if(GetLastError() == ERROR_IO_PENDING) 
    { 


     dw = WaitForSingleObject(overlapped.hEvent, INFINITE); 
    if(dw == WAIT_OBJECT_0) 
     if (GetOverlappedResult(hFile,&overlapped,&NumberOfBytesRead, TRUE) != 0) 
     { 
      if (NumberOfBytesRead != 0) 
      { 
       printf("!!!\n"); 
      } 

     } 

    } 

おかげ

+0

Windowsエラー関数GetLastError(http://msdn.microsoft.com/en-us/library/ms679360%28VS.85%29.aspx)を試して、結果のエラーの詳細な説明を投稿してください。 – Dodo

+0

エラーはありません。バッファには何も含まれていません – gln

+1

圧縮ファイルとは、OS圧縮ファイルを意味します。それらはまれです。 –

答えて

2

BUF_SIZE定数に使用している値は投稿していませんが、ボリュームセクタサイズの整数倍であることを確認してください。これはバッファリングされていないファイルストリームを使用するときの一般的な落とし穴です。 CreateFile() documentationFILE_FLAG_NO_BUFFERINGのドキュメントは言う:

が正常詳細はFile Bufferingを見るために、FILE_FLAG_NO_BUFFERINGフラグを使用してのCreateFileで開かれたファイルを扱うための厳格な要件があります。ファイルのバッファリングノートの

ページ:ファイルがFILE_FLAG_NO_BUFFERINGで開かれて を扱うとき

前述したように

、アプリケーションが特定の要件を満たす必要があります。次の詳細が適用されます。OVERLAPPED構造オフセットオプションのファイルを含む

  • ファイルアクセスサイズが、指定 場合、ボリュームセクタ サイズの整数倍のバイト数のためでなければなりません。たとえば、セクタサイズが512バイトの場合、アプリケーションは512,524バイト、1,024バイト、1,536バイト、または2,048バイトの読み取りと の書き込みを要求できますが、335,981または7,171バイトの書き込みは要求しません。

  • 読み出し用

    ファイルアクセス・バッファ・アドレス及び書き込み動作は ボリュームの物理セクタサイズの整数倍であるメモリ内のアドレスに位置合わせを意味し、 が整列物理セクタであるべきです。ディスクに応じて、この要件は ではない場合があります。

アプリケーション開発者は、 が4,096バイトの物理的なメディアのセクタサイズを市場に導入されているストレージデバイスの新しいタイプのノートを取る必要があります。

私のシステムでは、この値は4Kであり、一度に4Kより小さい値を読み取るとエラーが発生します。多くのマイクロソフトのコードサンプルでは、​​1Kがデフォルトのバッファサイズなので、例を適用するとバッファされていないI/Oでエラーが発生することがよくあります。

を編集する:OVERLAPPED構造体のすべてのメンバーをゼロにしてください。あなたは常に、次のようにOVERLAPPED構造をクリア0にInternalInternalHighメンバーを設定しない:

OVERLAPPED overlapped; 
ZeroMemory(&overlapped, sizeof(OVERLAPPED)); 

次に、ファイルオフセットとイベントハンドルを設定することができます。

編集:これは潜在的に誤った結果を回避するための非同期操作である場合は、このパラメータに

利用NULL:またReadFile()からlpNumberOfBytesReadパラメータに関する次の注意事項を検討してください。 [...]詳細については、「備考」を参照してください。

0

エラーがない場合でも、ドドで言ったように、あなたがのGetLastError()を呼び出した場合、それが良いだろう。

が、これは私のコードです。 ReadFileが返すものは非常に大きな助けになるでしょう。遠方のISOファイルが関係しているので、私はそれらが圧縮されたファイルタイプだと思います。あなたはLzRead関数を使用するために探すことができます。ここでこれを見てください: "

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365226%28v=vs.85%29.aspx
"。 LzOpenFileでファイルを開くこともできます。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365225%28v=vs.85%29.aspx
それが助けてくれることを願っています。カントはこのトピックについて多くを見つける。

1

私は、32ビットの符号なし整数の境界を越えるサイズのファイルを読み込む場合は特に、重複のOffsetOffsetHigh分野に細心の注意を払ってお勧めします。あなたが直面している問題がそこに潜んでいると私は信じています。