ファイル書き込みのAPIを作ろう(Win互換)

  • (by K, 2006.06.06)
  • 発展課題のページ(全部読む前にここを読むのは混乱するのでおすすめじゃないです)
  • ファイル書き込みのAPI例がほしいということなので書いてみる。
  • ただしもともと「はりぼてOS」は読み込みさえできればいいやと割り切って作った部分があるので、これに書き込み機能をつけても、書き込み速度は速くありません。本でいうとここから半日くらいかけて改良していくことになります。その程度の例であることを忘れずに。
  • ファイルシステム的には確かに書き込みできますが、実際のディスクへの書き出し部分はつけてないので、電源を切ると書き換え内容はすべて消えます。ディスクへの書き出し方法については、advance/FDCを参照。

まずはAPIの仕様を決める

  • ファイルのオープンのAPI(EDX=21)では、読み込みモードや書き込みモードなどのモードを指定する方法を用意していませんでした。これは本を書く段階では読み込みしか考えていなかったせいです。
  • だからまあここを直せばいいのですが、そうすると api_fopen を修正する必要が出てきて、それにともなってアプリをmakeし直す必要が出てきます。それはめんどうなので、書き込み可能なオープンを追加することにしました。
  • ファイルに書き込む場合、基本的に内容は上書きされていきます。もしファイルサイズが足りなければ、自動でファイルサイズも増やされます。上書きなので100バイトの既存ファイルをオープンして10バイト書き込んでもファイルサイズは100バイトのままです。これを10バイトにしたい場合は、書き込みバイト数0でファイル書き込みAPIを一度呼び出せばよい、ということにします。
    ファイルの書き込み用オープン(読み込みも可)
     EDX = 28
     EBX = ファイル名
     EAX = ファイルハンドル(OSから返される)
     普通のオープンとの違いは、指定されたファイルが存在しなくてもエラーにならないことです。
      (サイズ0の新規ファイルを作成)
    
    ファイルの書き込み
     EDX = 29
     EAX = ファイルハンドル
     EBX = バッファの番地
     ECX = 最大書き込みバイト数
     EAX = 今回書き込めたバイト数(OSから返される)

改造

  • 改造するのは以下の点です。
    • struct FILEHANDLE にflagsをつけて、ファイル書き込みがあったかどうかを記録できるようにする。ついでにファイルのオープンのAPI(EDX=21)のときにこのflagsを0にする処理も追加します。
    • ファイルの書き込み用オープンのAPI(EDX=28)を追加する。
    • ファイルの書き込みのAPI(EDX=29)を追加する。
    • ファイルのクローズのAPI(EDX=22)を改造して、ファイル書き込みがあった場合はディスクバッファへ書き戻す。
  • つづく(サンプル準備中)

こめんと欄

  • 電源を切ったら消えるって・・保存っていえますか?(まあ、確かにほぞんしてるけど) -- Clover 2006-06-07 (水) 15:25:58
  • 仮に言えないとして、どうしてほしいのでしょうか? 意図が分かりません。他の人の迷惑になるので、もう少し慎重に発言してください。 -- K 2006-06-07 (水) 16:59:06
  • みてて思ったんだけど、再起動とかしても残る方法ってないんですか?多分みんなそっちのほうがいいと思います。 -- Clover 2006-06-07 (水) 18:35:58
  • 「ディスクへの書き出し方法については、advance/FDCを参照。」と書いてあります。 -- M59 2006-06-07 (水) 18:59:44
  • ふげ〜〜〜難しい。サンプルソースが超欲しい。 -- アセンブラマスターするぞ!! 2006-06-08 (木) 15:59:27
  • 多分作りますので気長に待っていてください(待てるなら)。ただし今忙しいので結構先になりそうです。待ちきれなければ挑戦してうまくいったら発表してしまいましょう! -- K 2006-06-08 (木) 18:46:00
  • Kさんへ。Kさんの手助けになるように作ってみます。Kさんもいろいろとお忙しいということを聞いていますので、Kさんも、たまには少し休んでみては? -- アセンブラマスターするぞ!! 2006-06-09 (金) 07:07:47
  • このAPIの仕様や改造の例で読み込みだけでなく書き込みもすべてFDCでできそうです。ありがとうございます。 -- aotatsu 2009-02-01 (日) 09:43:06
  • fwrite関係ないですけどOSのコンソールにdeleteコマンドを付けようとおもって、ディスクの読み込まれたところのファイル情報のファイル名の先端に0xe5を書き込んだら一応いいんじゃない?とおもってやったら普通にできたので報告します。 -- Triangle_Ld. 2009-06-21 (日) 01:18:59

コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2009-06-21 (日) 01:18:59 (4386d)