ReadFileとWriteFile関数について
Posted: 2012年11月14日(水) 15:20
ディスクの読み書きの件で意見を求めるトピックを建てたことで
CreateFileの話が出ました。
そこで改めてCreateFileやReadFile,WriteFileを、マイクロソフト社のWEBで調べて見ました。
私が普段使っているVC6++とは違いVC++2005以降では
ファイルアクセスの仕方が大幅に変更されていることが判明しました。
前回のトピックが何度探しても判らないし、大事な事なので 新規にトピックを建てることにしました。
VC++2005のマイクロソフト社の解説に以下の部分が追加されていました。
ReadFile WriteFile
WEB原文通り
・ファイルアクセスは、ボリュームのセクタサイズの整数倍のバイトオフセットの位置で開始しなければなりません。
・ファイルアクセスのバイト数を、ボリュームのセクタサイズの整数倍にしなければなりません。
たとえば、セクタサイズが 512 バイトの場合、512 バイト、1,024 バイト、2,048 バイトの読み書きはできますが、
335 バイト、981 バイト、7,171 バイトなどの読み書きはできません。
ご指摘の通り、私もopenもしくは_openは、CreateFileに自動的置き換えられていると理解して来ましたが
この調査で、どうやらそう簡単に考えてよいものではないらしいことが分かりました。
以前から_openのハンドル番号とCreateFilのハンドル番号が前者は主に1桁台、後者は2桁台であることに
関心を寄せて来ました。これまでは単に混同しないための配慮かなと思って来たのですが。
(同一ファイルを時間直列でオープン、クローズして実施した際のハンドル番号ですが)
主な関数群、下記の2系列
_open,_read,_write,_close
CreateFile,ReadFile,WriteFile,CloseHandleについてです。
問題は
VC6++ではファイルアクセスは指定したバイト数でOKであったが
VC++2005以降ファイルアクセスはセクター単位かその整数倍で行われることに変更されたことです。
この変更でディスクアクセスのコーディングが複雑になりました。
今後、ReadFileとWriteFileを使う時は、アタッチメントの役割をする部分を間にはさまなくてはなりません。
それも開発ソフト毎に対応を変える必要があります。
物理的にディスクアクセスがセクター単位であることは判っていましたから、ファイル設計するときは
なるべくセクター単位と思われる256、512、1024に沿うようにしてきましたが、
そうもできないファイルも多いのが現実です。
私は当面_openを主に使うことにしますが、皆さんはどうされているのでしょうか。
CreateFileの話が出ました。
そこで改めてCreateFileやReadFile,WriteFileを、マイクロソフト社のWEBで調べて見ました。
私が普段使っているVC6++とは違いVC++2005以降では
ファイルアクセスの仕方が大幅に変更されていることが判明しました。
前回のトピックが何度探しても判らないし、大事な事なので 新規にトピックを建てることにしました。
VC++2005のマイクロソフト社の解説に以下の部分が追加されていました。
ReadFile WriteFile
WEB原文通り
・ファイルアクセスは、ボリュームのセクタサイズの整数倍のバイトオフセットの位置で開始しなければなりません。
・ファイルアクセスのバイト数を、ボリュームのセクタサイズの整数倍にしなければなりません。
たとえば、セクタサイズが 512 バイトの場合、512 バイト、1,024 バイト、2,048 バイトの読み書きはできますが、
335 バイト、981 バイト、7,171 バイトなどの読み書きはできません。
ご指摘の通り、私もopenもしくは_openは、CreateFileに自動的置き換えられていると理解して来ましたが
この調査で、どうやらそう簡単に考えてよいものではないらしいことが分かりました。
以前から_openのハンドル番号とCreateFilのハンドル番号が前者は主に1桁台、後者は2桁台であることに
関心を寄せて来ました。これまでは単に混同しないための配慮かなと思って来たのですが。
(同一ファイルを時間直列でオープン、クローズして実施した際のハンドル番号ですが)
主な関数群、下記の2系列
_open,_read,_write,_close
CreateFile,ReadFile,WriteFile,CloseHandleについてです。
問題は
VC6++ではファイルアクセスは指定したバイト数でOKであったが
VC++2005以降ファイルアクセスはセクター単位かその整数倍で行われることに変更されたことです。
この変更でディスクアクセスのコーディングが複雑になりました。
今後、ReadFileとWriteFileを使う時は、アタッチメントの役割をする部分を間にはさまなくてはなりません。
それも開発ソフト毎に対応を変える必要があります。
物理的にディスクアクセスがセクター単位であることは判っていましたから、ファイル設計するときは
なるべくセクター単位と思われる256、512、1024に沿うようにしてきましたが、
そうもできないファイルも多いのが現実です。
私は当面_openを主に使うことにしますが、皆さんはどうされているのでしょうか。