(Q&A掲示板が調子悪そうなので、こちらに再投稿します。)
あるメディア(例えばFD)にファイルをコピーして、そのファイルがメディアに正常に書き込めたかを確かめるために再度読み出して元ファイルと比較するプログラムを作成しています。ファイルシステムは、その読み出しの際にメディアから読み出すことはせず、書き込みの際に溜めたキャッシュにあるデータを渡すことで高速化を図っているようです。これでは目的が達成できません。FDのようにリムーバブルなものであれば一時的に手で再マウントしてやれば、キャッシュを無効にして読み直しをしてくれるようですが、それをしたくありません。APIなどでキャッシュを無効にするとかで読み直しをさせることのできる技をご存知ありませんか。読み出しはInput関数を使用しています。
ディスク全体のキャッシュのクリアとなると、見つかるのは,
・ボリュームを丸ごとロックするとキャッシュがクリアされる
・Interrupt 21h の Function 710Dhを使う
あたりですね。
最初に書き込み用にファイルを開くときにキャッシュ無しのモードで開く(APIを使う)方が現実的かもしれません。
、
API関数のCreateFile、特に第6引数について調べてみてください。
# 勿論、Input関数の利用は諦めてもらいます。
貴重な情報ありがとうございます。
早速調査の上、挑戦してみます。
とりあえずボリュームをロックする手法で旨く行きましたのでご報告します。
その他の紹介して頂いた手法ですが、
まずINT21hの710Dhですが、APIとして呼出す方法が見つからなかったので諦めました。
次にCreateFile()のキャッシュ無しオープンですが、調べるとhttp://yokohama.cool.ne.jp/chokuto/advanced/function/CreateFile.htmlに詳しい内容が掲載されていました。しかし、キャッシュ無しですと書き込めるサイズがセクタバイト数の整数倍単位であるという制約があるので、最後の端数の処理で困ると思い、諦めました。
ボリュームをロックする手法についてはhttp://www31.ocn.ne.jp/~heropa/vb31.htmに、メディアを取り出す例題としてロックする関数が応用されているソースが掲載されていましたので、これを参考に作成しました。
まだ十分なテストはしていませんが、何となく読み直してくれているようです。
以上、取り急ぎご報告します。
ありがとうございました。
ツイート | ![]() |