複数のブロックを備えたブロック消去可能なプログラマブルリードオンリメモリにおいて割り当てを解除されたスペースを再利用する方法であって、再利用すべきブロックにおいて、少なくとも1つのデータ領域を、割り当てを解除されているものとして識別するステップと、前記再利用すべきブロックにおいて、少なくとも1つのデータ領域を、割り当てられているものとして識別するステップと、スペアブロックを消去するステップと、割り当てられているデータ領域を前記再利用すべきブロックから前記スペアブロックへコピーすることにより、前記割り当てを解除されているデータ領域に対応する記憶エリアが割り当てのために再利用されるステップとを含む方法。前記割り当てられたデータ領域は前記スペアブロック内の連続するメモリ位置にコピーされる請求項1に記載の方法。前記メモリの少なくとも1つのブロックにファイルシステムのディレクトリ構造に関連するデータを記憶するステップをさらに含む請求項1に記載の方法。前記ファイルシステムのディレクトリ構造に関連するデータはディレクトリ階層を規定する請求項3に記載の方法。前記システムのディレクトリ構造は複数のディレクトリを含み、ディレクトリはサブディレクトリをさらに含む請求項4に記載の方法。前記ブロックは可変長のデータ領域にデータを記憶するように構成される請求項1に記載の方法。各ブロックは、それぞれのブロックにおけるデータ領域を参照するデータ要素を有する割り当てデータ構造をさらに含む請求項6に記載の方法。前記割り当てデータ構造及び前記データ領域は前記ブロックの両端に配置され、前記割り当てデータ構造及び前記データ領域はデータが前記ブロックに書き込まれるにつれて互いに向かって成長する請求項7に記載の方法。前記割り当てデータ構造のデータ要素は、前記データ要素により参照されるそれぞれのデータ領域の長さを示す情報を含む請求項7に記載の方法。前記割り当てデータ構造の前記データ要素は、前記データ要素により参照される前記それぞれのデータ領域の開始位置を示す情報をさらに含む請求項9に記載の方法。請求項1乃至10のいずれか1項に記載の方法をコンピュータに実行させる命令を有するコンピュータ。請求項1乃至10のいずれか1項に記載の方法をコンピュータに実行させる命令が記録されたコンピュータ読み取り可能な記録媒体を有するコンピュータ。従来のファイルシステムは、記憶装置が多数回書き込み能力を有するものと仮定していたので、これらのファイルシステムは、実際上一回の書き込み能力しか持たないFEPromには不適である。従って、FEPromをベースとする記憶装置をサポートするファイルシステムをもつことが望ましい。このようなファイルシステムは、コンピュータシステムの速度と、コンピュータディスクの不揮発性とを有するものである。コンピュータディスクのような従来の記憶装置は、バイトでアドレスできるのではなくブロックでアドレスすることができる。バイトは、コンピュータの内部メモリのアドレス能力の単位であり、即ちコンピュータは一度に1バイト典型的に8ビットで書き込み又は読み取りすることができるのであって、それ未満ではできない。コンピュータがディスクに書き込んだりディスクから読み取ったりするときには、ブロックと称するバイトのグループで行わねばならない。ブロックのサイズは変えられるが、典型的には2の累乗である128、256、512等。例えば、ディスク上の1バイトだけを変更しようとする場合に、そのブロックサイズ内の全バイト数の書き込みを行わねばならない。これには、ディスクからコンピュータメモリへブロック全体を読み取り、1バイトを変更し内部メモリはバイトでアドレス可能であるそしてそのブロック全体をディスクに書き込むことが含まれる。従来のファイルシステムは、ブロックに未使用の部分を残す状態でデータを記憶する。このファイルシステムは、一度に1つのファイルのみからのデータを所与のブロック内に記憶する。例えば、このファイルシステムは、1つのファイルからのデータをブロックの最初の50バイトには記憶せず、そして別のファイルからのデータを128バイトブロックの最後の78バイトには記憶しない。しかしながら、ファイルの長さがブロックサイズの偶数倍でない場合には、ブロック端のスペースが未使用となる。上記例において、ブロックの最後の78バイトは未使用となる。ディスクが4096といった大きなブロックサイズを使用するときには、4095バイトまでのデータが使用できないことになる。多数回書き込み能力を有していて数百万バイトを記憶できるようなディスクドライブではこのような未使用スペースが無視できる量であるが、多数回書き込み能力をもたず、しかも数百万バイトのデータを記憶する容量をもたない記憶装置では相当の量である。FEPromは、典型的な記憶装置に比して、ブロックアドレス式ではなくてバイトアドレス式である。従って、FEPromのバイトアドレス能力をサポートするファイルシステムをもつことが望まれる。又、FEPromは、ブロックで消去可能なフォーマットで編成することができる。ブロックで消去可能なFEPromは、個々に消去できる多数のブロック典型的に16を含んでいる。例えば、図6は、0から15まで番号が付けられた16個のブロックを有するブロック消去可能なFEProm301の概略図である。ブロックの各々は、他のブロックの内容に影響を及ぼすことなく個々に消去することができる。ブロック番号14のブロック302は、他のブロックのデータに影響を及ぼすことなく消去することができる。ブロック消去可能なFEPromをサポートするファイルシステムをもつことが所望される。そこで、本発明の目的は、ファイル記憶装置、特に、ブロック消去可能で且つフラッシュ消去可能なプログラマブルリードオンリメモリにデータを記憶する方法を提供することである。本発明の別の目的は、ブロック消去可能なFEPromにおいてメモリを割り当てたり割り当て解除したりするコンピュータメモリマネージャを提供することである。本発明の別の目的は、ブロック消去可能なFEPromにおいてブロックを消去した回数を追跡する方法を提供することである。本発明の更に別の目的は、メモリの割り当てを容易にするデータ構造体を備えたブロック消去可能なFEPromを提供することである。本発明の更に別の目的は、データを記憶するためのブロックを割り当てる方法を提供することである。本発明の更に別の目的は、ブロック消去可能なFEPromにおいて割り当て解除されたスペースをリクレイミングする方法を提供することである。本発明の更に別の目的は、ブロック消去可能なFEPromのためのファイルシステムを提供することである。本発明の上記及び他の目的は、以下の説明から明らかとなるように、ブロック消去可能で且つフラッシュ消去可能なプログラマブルリードオンリメモリにおいてメモリをマネージするための方法及びシステムを提供することにより達成される。このシステムは、好ましい実施例において、ブロックヘッダと、ブロック割り当てテーブルと、データ記憶エリアと、データを記憶すべきブロックを選択するためのブロック割り当てルーチンと、ブロック割り当てテーブルのエントリ及びデータ記憶エリアの一部分を選択するためのデータエリア割り当てルーチンと、データを記憶するための記憶ルーチンとを有したブロック消去可能なFEPromを具備している。又、このシステムは、好ましい実施例において、ブロック消去可能なFEPromのためのファイルシステムを実施するファイルマネージャを備えている。好ましい実施例において、本発明は、ブロック消去可能なFEPromのメモリをマネージする方法及びシステムを提供する。このシステムは、FEPromマネージャ及びファイルシステムとして説明する。FEPromマネージャは、FEPromのメモリの割り当てと割り当て解除とを管理する。ファイルシステムは、ハイアラーキ式のディレクトリシステムであり、FEPromマネージャを用いてメモリの割り当て及び割り当て解除を行う。或いは又、FEPromマネージャ及びファイルシステムは、ある最適化を達成するように一体化することができる。しかしながら、個別のFEPromマネージャを使用することによりFEPromは異なるファイルシステムからのデータや非ファイルシステムデータも記憶することができる。本発明のFEPromマネージャは、ブロック消去可能なFEPromにおいて自由スペースの割り当て、割り当てられたスペースの割り当て解除、及び割り当て解除されたスペースのリクレイミングを行う。図26に示す好ましい実施例では、FEPromの各ブロックが、ブロック割り当て構造体2302と、データ領域2303と、自由スペース2304とを含んでいる。ブロック割り当て構造体2302は、ヘッダ及び割り当てアレイを含んでいる。ヘッダは、ブロックの状態情報を含む固定長さの構造体である。割り当てアレイは可変長さであり、割り当てアレイのエントリはデータ領域を記述する。テーブルAは、ブロック割り当て構造体のデータ構造を示している。この構造体は、構造体変数の記述と共にCプログラミング言語フォーマットで示されている。アレイのAllocは、割り当てアレイであり、他の変数がヘッダを構成する。データ領域は、FEPromに記憶されたデータを保持する可変長さの領域である。自由スペース2304は、ブロック割り当て構造体又はデータ領域に割り当てられないスペースである。ブロック割り当て構造体2302及びデータ領域2303はブロックの両端に割り当てられる。領域が追加されるときには、ブロック割り当て構造体2302及びデータ領域が矢印2305及び2306によって示されたように互いに向かって成長する。ブロック割り当て構造体のAllocエントリは、ブロックの対応領域に対するオフセット2310-2315を含んでいる。好ましい実施例においては、ブロック割り当て構造体が、その領域に記憶されたデータに対して特定のデータを含んでいる。テーブルAデータ構造体structBlockAllocation{struct{byteStatusbyteOffset3wordLen}AllocdwordBootRecordPtrdwordEraseCountwordBlockSeqwordBlockSeqChecksumwordStatus}定義Allocブロック内の領域を定める可変長さアレイ構造体Status領域の状態ビット521111未使用1011中間状態0111自由0011割り当てられた0001割り当て解除された0010取って代わられた0000ゼロ7611未使用エントリ10最終エントリ00非最終エントリOffsetこの領域のブロックの開始に対するオフセットLen領域の長さBootRecordPtrFEPromがファイル記憶装置として使用されるときに記録をブートするための処理EraseCountブロックを消去した回数BlockseqFEProm内のブロックの論理シーケンスBlockSeqChecksumブロックシーケンス番号のチェック和Statusビット1011ブロックにないブート記録状態、割当て解除された状態、解放されたフリー状態、または割当て進行中状態にセットしている時に、もし書込みエラーが発生すると、そのエントリを空白状態にセットすることによってFEPromは一貫した状態に保たれる。しかしながら、もしあるエントリを割当て済状態にセットしている時にエラーが発生すると、データ領域は割当て済状態の対応割当てアレイエントリを有していないのであるから、FEPromは非一貫状態になる。FEProm管理者はそのデータ領域に対して別のエントリを割当てる。あるエントリを空白状態にセットしている時にもエラーは発生し得る。空白状態は、0の値のステータスとして定義されているから、あるエントリを空白状態にセットしている時に発生するエラーは必然的にハードウエアエラーである。もしエラーが発生すれば、対応する領域を再利用しなければならないことを指定する再利用を必要とするかも知れない。例えば、もしあるエントリを割当て解除状態にセット中に、及び再びそのエントリを空白状態にセット中にエラーが発生すれば、そのエントリは割当て済状態になる。もしこの状態のままであれば、このエントリ及び対応データ領域は正常の再利用の下では決して再利用されなくなる。ブロック見出しに書込み中にエラーが発生すると、FEProm管理者はそのブロックを消去待ち行列状態にセットする。もしあるブロックを消去待ち行列状態にセット中にエラーが発生すれば、FEProm管理者はそのブロックを引退状態にセットするので、そのエラーを回復することはできなくなる。あるブロックを消去中に書込みエラーが発生すると、FEProm管理者はそのブロックを引退状態にセットする。もし引退させたブロックが予備ブロックであったならば、FEProm管理者は少なくなった予備ブロックで動作する。代替としてFEProm管理者は割当て済の割当てアレイエントリを用いずにブロックを探知することを試みる。次いでFEProm管理者は探知したブロックを消去し、それを予備状態にセットする。予備ブロックが使用できない場合にはFEProm管理者はFEPromを、あたかもそれが前述した消去不能であるかのように取扱う。本発明は、FEPromが非一貫状態にある場合の動的エラー回復をも提供する。図33を参照する。例えば、もしブロック2905においてオフセットが書込まれた後に、しかしブロック2908において状態が解放状態から割当て済状態へ更新される前にFEPromが除去されれば、FEPromは非一貫状態になる。FEPromに次にロードする時に、FEProm管理者は割当てエントリが解放されていることを見て、それを再使用しようとする。しかしながら、オフセットへ書込もうとする試みは失敗する同一データがオフセットへ書込まれている場合を除く。上述したように、FEProm管理者はエントリを空白状態にセットすることによって回復し、領域割当てプロセスを再始動させて異なるエントリを選択する。もしFEPromが取外される前にデータの一部分がデータ領域へ書こまれれば、FEProm管理者がデータをその領域へ書込もうとする時にエラーが検出される。このエラーは上述したようにして処理される。ファイルシステム本発明は、FEProm装置に対してディレクトリをベースとする階層ファイルシステムを提供する。階層ファイルシステムは論理的グルーピング内にファイルを記憶させる。好ましい実施例は、ディレクトリ階層及び内部ファイル記憶の両者を実現するためにリンクされたリストデータ構造を使用する。図1に典型的な階層ディレクトリ構造を示す。ワシントン州レッドモンドのマイクロソフト社から入手できるMSDOSオペレーティングシステムが、階層ディレクトリ構造を有するファイルシステムを実現する。図1に示すように、ディレクトリルート100は、2つのサブディレクトリDOS102及びワード103と、2つのファイルAUTOEXECBAT104及びCOMMANDCOM105とを含む。ディレクトリDOS102は1つのファイルFORMATEXE106を含む。ディレクトリワード103は次に低いレベルに2つのサブディレクトリデービッド107及びメリーMARY108を含む。ディレクトリデービッド107は1つのファイルLETTER1DOC109を含む。ディレクトリメリー108は3つのファイルLETTER1DOC110、LETTER2DOC111及びLETTER3DOC112を含む。図2は、好ましい実施例において図1のディレクトリ構造を実現する考え得るリンクされたリストを示す。ディレクトリルートレコード100本明細書においてはレコード及びエントリという語を互換可能なように使用するはポインタ120を有し、このポインタ120は次に低いレベルのサブディレクトリのリンクされたリスト140及びファイルレコードを指し示す。リンクされたリスト140は、ポインタ121、122、123によってリンクされたサブディレクトリレコードDOS102及びワード103と、ファイルレコードAUTOEXECBAT104及びCOMMANDCOM105とからなる。サブディレクトリレコードDOS102は次に低いレベルのファイルレコード106を指し示すポインタ124を有し、サブディレクトリレコードワード103は次に低いレベルのファイルレコードのリンクされたリスト141を指し示すポインタ125を有している。リンクされたリスト141は、ポインタ126によってリンクされているディレクトリレコードデービッド107及びメリー108からなる。サブディレクトリレコードデービッド107は次に低いレベルのファイルを指し示すポインタ127を有し、サブディレクトリレコードメリー108は次に低いレベルのファイルレコードのリンクされたリスト142を指し示すポインタ128を有している。リンクされたリスト142は、ポインタ129及び130によってリンクされているファイルレコードLETTER1DOC110、LETTER2DOC111及びLETTER3DOC112からなる。右上のテンプレート10は図面を通して使用されるレコードレイアウトを示す。好ましい実施例では図2に示すレコードは、以下に説明するようにDirEntry及びFileEntry構造である。図2は、図1を表す単に1つの考え得るリンクされたリスト配列を表すに過ぎない。この配列は、もしファイルが追加されたが次いで削除されたか、またはディレクトリ名が変更されていれば異なる配列になる。図3は別の考え得る配列を示す。図3は、図1と同一のディレクトリ階層を表しているが、一時期存在したディレクトリビルBILL113は削除されている。FEProm装置は一回限り書込み可能である消去された場合を除くから、本発明の好ましい実施例では図3に示すように、ディレクトリレコードビル113をリンクされたリストから物理的に除去しない。ディレクトリまたはファイルは、ディレクトリまたはファイルエントリのステータスをセットすることによってリンクされたリストから削除される。もしディレクトリまたはファイルがコンピュータディスク上に記憶されていたのであれば、ディレクトリレコードビル113は、ディレクトリレコードメリー108を指し示しているポインタ131をディレクトリレコードデービッド107内に再書込みすることによって物理的に除去することができる。好ましい実施例は、あるファイルを構成する範囲をリンクするためにもリンクされたリストデータ構造を使用する。各ファイルはそれに対応付けられたファイルレコードを有し、このファイルレコードは他のデータと共にファイル名を含み、また上述したようにディレクトリ階層内にリンクされている。ある範囲は、そのファイルに関するデータを含むメモリの連続域である。各ファイルは、ファイルデータを含む1またはそれ以上の範囲である。各範囲はそれに対応付けられた範囲レコードを有している。範囲レコードは、他のデータと共にその範囲を指し示すポインタと範囲の長さとを含む。図4はファイル\A\DDAT202の範囲を示す。範囲レコードR1203、R2204及びR3205はリンクされ、対応範囲E1211、E2212及びE3213を指し示すポインタを含んでいる。ファイルは範囲E1211、E2212及びE3213の論理的連結である。好ましい実施例では、範囲レコードは後述するようにFileInfo構造である。図4は、ファイル\A\DDAT202のための単なる1つの考え得るリンクされたリスト配列を表すに過ぎない。図5に同一ファイルを表す別の配列を示す。範囲E4214はファイルに追加されたが、削除されている。好ましい実施例では範囲レコードR4206は、ファイルを構成する範囲のリンクされたリストから物理的に除去されていない。そうではなく、レコードの削除を指示するようにレコードのステータスをセットすることによって範囲レコードR4206は論理的に除去されているのである。表C及びDは、本発明の好ましい実施例に使用される幾つかのデータ構造を含んでいる。表Cに示されているデータ構造はBootRecordである。BootRecordは、以下に説明するように、ファイルシステムの識別に関するある一般的な情報、FEPromをアクセスすることができるファイルシステムのバージョン番号、ルートディレクトリを指し示すポインタ、及び付加的なデータを含む。表Dに示す第1及び第2の構造は、DirEntry構造及びFileEntry構造である。これらの構造の1つが各ディレクトリ及びファイル毎に割当てられる。これらの構造は同一である。変数SiblingPtrはディレクトリ階層の同一レベルのDirEntry構造及びFileEntry構造のリンクされたリスト内の次の同胞を指し示す。変数PrimaryPtr及びSecondaryPtrは以下に詳述する。第3の構造は、FileInfo構造である。各ファイル範囲は関連FileInfo構造を有している。変数PrimaryPtrはファイルのFileInfo構造を指し示す。表Cデータ構造structBootRecord{wordSignaturedwordSerialNumberwordFFSWriteVersionwordFFSReadVersionwordTotalBlockCountwordSpareBlockCountdwordBlockLendwordRootDirectoryPtrwordStatusbyteVolumeLabelLenwordBootCodeLenbyteVolumeLabelbyteBootCode}定義Signature媒体がこのファイルシステムを支援することを指示する値SerialNumberVolumeLabelとの組合せは特定FEPromの独特な識別子であるFFSWriteVersionこのボリュームへ書込むために要求されるファイルシステムの高バイトにおけるバージョン番号及び低バイトにおける改定番号FFSReadVersionこのボリュームを読出すために要求されるファイルシステムの最早バージョンの高バイトにおけるバージョン番号及び低バイトにおける改定番号TotalBlockCountFEProm内の予備ブロックを含むブロックの合計数SpareBlockCountブロック再利用及びエラー回復に使用可能なブロックの数BlockLenバイトで表したブロックの長さRootDirectoryPtrルートディレクトリを指し示すポインタStatusファイル名フォーマットを指定するデータVolumeLabelLenボリュームラベル内の文字の数BootCodeLenブートコードアレイ内のバイトの数。もし0ならば媒体はブート不能VolumeLabelボリュームラベルBootCodeオペレーティングシステムに関するブートコード表Dデータ構造structDirEntry{wordStatusdwordSiblingPtrdwordPrimaryPtrdwordSecondaryPtrbyteAttributeswordTimewordDatebyteNameLenbyteName8byteExt3}structFileEntry{wordStatusdwordSiblingPtrdwordPrimaryPtrdwordSecondaryPtrbyteAttributeswordTimewordDatebyteNameLenbyteName8byteExt3}structFileInfo{wordStatusdwordExtentPtrdwordPrimaryPtrdwordSecondaryPtrbyteAttributeswordTimewordDatewordExtentLenwordUncomprssedExtentLen}定義Nameディレクトリ/ファイル名Extファイル拡張Statusbit01:レコードはディレクトリ構造内に存在存在0:レコードはディレクトリ構造から削除済削除済11:レコードは現属性、日付、及び時間データを含む0:レコードは置換されたデータを含むか、またはデータを含まない3211:未定義10:FileInfo01:FileEntry00:DirEntry41:PrimaryPtrは有効ではない0:PrimaryPtrは有効51:SecondaryPtrは有効ではない0:SecondaryPtrは有効61:SiblingPtrExtentPtrは有効ではない0:SiblingPtrExtentPtrは有効DirEntry157保留FileEntry71:ファイルは圧縮されていない0:ファイルは圧縮されている158圧縮アルゴリズムの識別FileInfo71:ファイルは圧縮されていない0:ファイルは圧縮されている81:範囲は圧縮されたブロックの最初のセグメントを含まない0:範囲は圧縮されたブロックの最初のセグメントを含む91:範囲は圧縮されたブロックの最後のセグメントを含まない0:範囲は圧縮されたブロックの最後のセグメントを含む1510保留SiblingPtr同胞連鎖内の次のDirEntryまたはFileEntryを指すポインタExtentPtrFileInfoEntryに対応付けられた範囲を指すポインタPrimaryPtrDirEntry:ディレクトリ階層内の次に低いレベルの最初のDirEntryまたはFileEntryを指すFileEntry:ファイルに対応付けられたFileInfoエントリのリンクされたリストを指すFileInfo:ファイルのための次のFileInfoエントリを指すSecondaryPtrDirEntry:ディレクトリのための次のDirEntryエントリを指す;SecondaryPtrを除くこのエントリの全内容は有効ではなく、無視されるFileEntry:ファイルのための次のFileEntryエントリを指す;SecondaryPtrを除くこのエントリの全内容は有効ではなく、無視されるFileInfo:ファイルのための次のFileInfoエントリを指すAttributes読出し専用、読出し/書込み等のようなファイル属性Time創成または変更の時刻Date創成または変更の日付NameLenバイトで表した名前及び拡張の長さName8名前Ext3拡張ExtentLenバイトで表した範囲の長さ本発明のファイルシステムは、ディレクトリ及びファイル構造をブロック消去可能なFEProm内のブロック境界を横切って分散させる。ファイルシステムは、FEProm内の記憶装置の割当て及び割当て解除にFEProm管理者を使用する。ファイルシステムは、上述したように、リンクされたリスト内のポインタとしてハンドルを使用する。以下の説明ではハンドル及びポインタを互換可能に使用する。図30は、図2のディレクトリ階層の一部のブロック割当て例を示す。図30に示した部分はディレクトリルート、ディレクトリDOS、ディレクトリワード、ファイルAUTOEXECBAT、及びファイルCOMMANDCOMのためのDirEntry及びFileEntryレコードからなっている。ブロック0はディレクトリDOS及びディレクトリワードを含み、ブロック12はディレクトリルート及びファイルCOMMANDCOMを含み、そしてブロック14はファイルAUTOEXECBATを含んでいる。図28は、図30の例のブロック割当て構造及び領域例を示す。図28はブロック02401、ブロック122402、及びブロック142403を示す。ブロック02401は、領域2420及び2430を含む。領域2420はディレクトリDOSのためのDirEntryを含み、領域2430はディレクトリワードのためのDirEntryを含む。ブロック02401は、見出し2404、領域2420に対応するAlloc0エントリ2421、及び領域2430に対応するAlloc1エントリ2431をも含む。ブロック122402は領域2410及び2450を含む。領域2410はディレクトリルートのためのDirEntryを含み、領域2450はファイルCOMMANDCOMのためのFileEntryを含む。ブロック122402は、ブロック見出し2405、領域2410に対応するAlloc0エントリ2411、及び領域2450に対応するAlloc1エントリ2451をも含む。ブロック142403は、領域2490及び2440を含む。領域2490はブートレコードを含み、領域2440はファイルAUTOEXECBATのためのFileEntryを含む。ブロック142403は、ブロック見出し2406、領域2490に対応するAlloc0エントリ2491、及び領域2440に対応するAlloc1エントリ2441をも含む。図28では、ポインタ2407、2413、24233、2433、2443、2453、及び2493は、ポインタ2407から始まりブロック見出し2406内のブートレコードまでのディレクトリ階層を限定する。ブートレコード2490はブロック142403内にある。ブロック142403のための可変ステータスは、このブロックがブートディレクトリを含んでいることを指示する。BootRecordPtr2407はブートレコードのためのAlloc0エントリ2491を指し示している。Alloc0エントリ2491は、領域2490のオフセットを含む変数オフセット2492を含む。領域2490はブートレコードを含む。ブートレコードはディレクトリルートに対応するAlloc0エントリ2411を指し示すポインタRootDirectoryPtr2493を含む。Alloc0エントリ2411は、領域2410のオフセットを含む変数オフセット2412を含む。領域2410はディレクトリルートのためのDirEntryを含む。ディレクトリルートのPrimaryPtr2413はディレクトリDOSに対応するAlloc0エントリ2421を指し示す。Alloc0エントリ2421は、領域2420のオフセットを含む変数オフセット2422を含む。領域2420はディレクトリDOSのためのDirEntryを含む。ディレクトリDOSのSiblingPtr2423はディレクトリワードのためのAlloc1エントリ2431を指し示す。Alloc1エントリ2431は、領域2430のオフセットを含む変数オフセット2432を含む。領域2430はディレクトリワードのためのDirEntryを含む。ディレクトリワードのSiblingPtr2433はファイルAUTOEXECBATのためのAlloc1エントリ2441を指し示す。Alloc1エントリ2441は、領域2440のオフセットを含む変数オフセット2442を含む。領域2440はファイルAUTOEXECBATのためのFileEntryを含む。ファイルAUTOEXECBATのためのポインタSiblingPtr2443はファイルCOMMANDCOMのためのAlloc1エントリ2451を指し示す。Alloc1エントリ2451は、領域2450のオフセットを含む変数オフセット2452を含む。領域2450はファイルCOMMANDCOMのためのFileEntryを含む。SiblingPtr2453はFNULLにセットされ、リンクされたリストの終わりを指示する。このファイルシステムは、ディレクトリの追加及び削除、及びファイルの創成、拡張及び変更を可能にする。図7は、ディレクトリをFEPromへ追加するルーチンの流れ図である。このルーチンの入力パラメタは、新しいディレクトリの完全パスネームと、新しいディレクトリのための属性データである。このルーチンは、親ディレクトリのためのDirEntryのアドレスを含むように変数Pをセットし、また子ディレクトリのためのDirEntryのアドレスを含むように変数Cをセットする。例えば、パスネーム\P\Cは、ルートディレクトリのサブディレクトリであるPのサブディレクトリであるディレクトリCが創成されることを意味する。図8はディレクトリCがPの最初のサブディレクトリである場合を示し、図9はディレクトリCがPの最初のサブディレクトリではない場合を示す。図8及び9において、実線はディレクトリCを追加する前のディレクトリ構造を示し、点線はディレクトリCが追加された後のディレクトリ構造を示す。図7のブロック401においてシステムは、ルートディレクトリからの経路を追跡することによってディレクトリPを探知し、ディレクトリPのためのDirEntryを指し示すように変数Pをセットする。ディレクトリPを探知する時システムは、変数SecondaryPtrによって置換されていない限り変数PrimaryPtrを追跡する。ブロック402では、システムはディレクトリCのためのDirEntryに領域を割当てる。システムは、FEProm管理者の手順を呼出すことによって領域を割当てる。システムは、割当て済領域を指し示すように変数Cをセットする。以下の説明ではFEProm管理者から戻されるハンドルを領域を指し示すポインタと呼ぶ。ブロック403においてシステムは、変数名、時刻、日付、及び属性を新たに割当てられたレコード内にセットし、新たに割当てられたエントリがディレクトリエントリであることを指示するように変数ステータスをセットする。ブロック405乃至412においてシステムは、新しいディレクトリエントリを古いディレクトリ構造内へリンクする。システムは、ブロック406乃至410において新しいディレクトリがPの最初のサブディレクトリではない場合の状況を処理し、ブロック411及び412において新しいディレクトリがPの最初のサブディレクトリである場合の状況を処理する。ブロック405において、もしPrimaryPtrが有効であることをP->ステータスが指示すれば、ディレクトリPはサブディレクトリを有しているか、または有していたのであり、システムはブロック406へ進み、そうでない場合ディレクトリPはサブディレクトリを有していたことはなく、システムはブロック411へ進む。ブロック411では、システムは新たに割当てられたディレクトリエントリであるディレクトリCを指し示すようにP->PrimaryPtrをセットして新しいディレクトリへのリンキングを遂行する。ブロック412においてシステムは、変数PrimaryPtrが有効であることを指示するようにP->ステータスをセットしてルーチンを終了する。ブロック406においてシステムは、変数nextptrをP->PrimaryPtrに等しくセットする。変数nextptrは同胞サブディレクトリのリンクされたリスト内の次のディレクトリを指し示すポインタを含む。ブロック407において、SiblingPtrが有効であることをnextptrによって指し示されるレコードのステータスが指示していればシステムはブロック408へ進み、そうでなければ同胞のリンクされたリストの終わりに到達したのであり、システムはブロック409へ進む。ブロック408では、nextptrはnextptrによって指し示されるレコードのSiblingPtrに等しくセットされ、これはリンクされたリスト内の次のディレクトリを指し示すようにnextptrを前進させ、システムはブロック407へ進められてリンクされたリストの終わりに達したか否かが決定される。同胞のリンクされたリストの終わりを探索する場合、システムは変数SiblingPtrを追跡する。システムはブロック409において、nextptrによって指し示されるレコードのSiblingPtrを、ディレクトリCのためのDirEntryを指し示すポインタに等しくセットする。ブロック410においてシステムは、新たに割当てられたディレクトリエントリを指し示すエントリ内のSiblingPtrが有効であることを指示するように、nextptrによって指し示されるレコードのステータスをセットし、ルーチンを終了する。図10は、新しいファイルに関してFileEntryレコードをファイルシステム内へ追加するルーチンの流れ図である。FileEntryレコードは階層的な木構造のファイルシステムの単なる葉ノードに過ぎず、FileEntryレコードを追加するルーチンは図7に示したディレクトリ追加ルーチンに酷似している。主要な相違点はブロック803において、レコードがファイルであることを指示するように変数ステータスがセットされることである。図11及び12は、データをファイルの終わりに追加するためのルーチンの流れ図である。このルーチンには、完全パスネーム、書込まれるデータ及び書込まれるバイトの数が渡される。図13は拡張されるファイル\LDATを含むディレクトリ構造のレイアウトの見本である。実線はファイルが拡張される前の構造を示し、点線はファイルが拡張された後の構造を示す。ファイルLDATは始めにFileEntryレコード1101、FileInfoレコード1102、及びそれに対応付けられた範囲1103を有している。点線は、範囲D21105内のファイルへ追加されるデータを有するFileInfoレコード1104を表す。図11のブロック1001においてシステムは、領域をFEProm内の新FileInfoレコードに割当て、そのレコードを指し示すように変数FIをセットする。システムはブロック1002において領域をデータ範囲に割当て、その範囲を指し示すように変数Dをセットする。システムはブロック1003において、割当てられたブロックへデータを書込む。ブロック1004においてシステムは割当てられたFileInfoエントリ内に変数属性、時刻、及び日付をセットする。ブロック1005においてシステムは、FI->ExtentPtrを割当てられた範囲のハンドルにセットする。ブロック1005Aでは、FI->ExtentLenが範囲の長さを含むようにセットされる。ブロック1005BではFI->ステータスが、存在、ATDRecent、FileInfo、及びExtentPtrvalidにセットされる。ブロック1006ではシステムは、拡張すべきファイルのFileEntryレコードを探知し、そのレコードのアドレスにFEをセットする。好ましい実施例では、システムは新範囲及びFileInfoレコードを割当てる前にFileEntryレコードを探知して、何等かの割当てが行われる前にファイルが存在するようにしている。図11の続きである図12のブロック1007乃至1012においてシステムは、拡張すべきファイルの最後のFileInfoレコードもし1つが存在すればを探知する。システムはFileEntryレコード及びFileInfoレコードのPrimaryPtrまたはSecondaryPtrを追跡する。有効SecondaryPtrは、PrimaryPtrによって指し示されるレコードが、SecondaryPtrによって指し示されるレコード内のデータによって置換されたことを指示する。ブロック1007においてシステムは、ポインタnextptrをFileEntryレコードを指し示すポインタに等しくセットする。ブロック1008Aでは、ポインタprevptrがnextptrに等しくセットされる。ファイル内の最後のFileInfoレコードが探知されると、ポインタprevptrはそのレコードを指し示すポインタを含む。ブロック1009では、もしSecondaryPtrが有効であることをnextptrによって指し示されるレコードのステータスが指示していれば、PrimaryPtrによって指し示されるレコード内のデータは置換されたのであり、システムはブロック1011へ進み、そうでない場合はシステムはブロック1010へ進む。ブロック1010においてシステムはnextptrを、nextptrによって指し示されるレコードのPrimaryPtrに等しくセットしてリンクされたリスト内の次のレコードを指し示すポインタを入手し、ブロック1012へ進む。ブロック1011ではシステムはnextptrを、nextptrによって指し示されるレコードのSecondaryPtrに等しくセットしてリンクされたリスト内の次のレコードを指し示すポインタを入手し、ブロック1008Aへ進む。ブロック1012では、もしnextptrが有効であれば、リンクされたリストの終わりに達したのであり、システムはブロック1013へ進み、そうでない場合にはシステムは1008Aへ戻ってリンクされたリスト内の次のレコードを処理する。ブロック1013ではシステムはprevptrによって指し示されるレコードのPrimaryPtrを、FIを指し示すポインタに等しくセットしてファイルの拡張を遂行する。ブロック1014においてシステムはprevptrによって指し示されるレコードのステータスをPrimaryPtrValidに等しくセットしてルーチンを終了する。図14及び15は、ファイル内のデータを更新するファイル更新ルーチンの流れ図である。このルーチンのパラメタは、変更された関連範囲を持つためのFileInfoブロックのアドレスであるRと、新データのための範囲内へのオフセットであるextentoffsetと、新データであるnewdataと、新データの長さであるdatalengthとである。少なくともあるブロックが消去されるまでは、FEPromは1回書込み装置であるから、データが記憶される領域は、ファイルへの更新が発生する時には再書込みはできない。以下に説明するように好ましい実施例では更新されるデータはFEPromの異なる領域へ書込まれる。図16は、あるファイルのためのFileInfoレコードのリンクされたリストの典型的部分を示す。ファイル更新ルーチンは陰影を施した領域1301によって表されるデータを置換する。図17は変更されるデータがFEPromへ書込まれた後のリンクされたリストの構造を示す。3つのFileInfoレコードR11411、R21412、及びR31413がリンクされたリスト内へ挿入されている。範囲全体が再書込みされるのではなく、実際に変更された部分だけが再書込みされるのである。ルーチンは範囲を3つの区分D11401、D21402、及びD31403に分割する。区分D11401及びD31403は、更新によって変化しないデータを含み、区分D21402は変化するデータを含む。各区分は対応するFileInfoレコードを有する。FileInfoレコードR11411、R21412、及びR31413はそれらのPrimaryPtrフィールドを通してリンクされている。またR11411及びR31413内のExtentPtrフィールドはそれらの対応範囲区分を指し示すようにセットされ、ExtentLenフィールドがセットされる。新範囲は、レコードR21412によって指し示される区分である新D21404に対応する新データに割当てられる。レコードR1410のSecondaryPtrはFileInfoR11411を指し示し、R1410のPrimaryPtrが置換されたことを指示する。FileInfoレコードR31413のPrimaryPtrはFileInfoレコードR1410のPrimaryPtr内に含まれている値にセットされてリンクを完了する。ファイル更新ルーチンは、ブロック内に3つの新Allocエントリを追加するための範囲を含む十分なスペースが存在することに依存する。これら3つのAllocエントリは、1つの領域ではなく3つの領域内に範囲を再定義する。もし十分なスペースが存在しなければ、ブロックの再利用によって空きスペースを発生させることができ、ファイル更新ルーチンを呼出すことができる。しかし、もし十分な空きスペースが存在しなければ、その範囲内のデータは新範囲へ移動させられる。もしデータが移動させられれば、新データは古データと統合され、1つだけのFileInfoレコードを有する新ブロック内の1領域へ書込まれる。古ブロック内の領域は割当て解除される。好ましい実施例では、FEProm管理者は既存領域の部分を指し示すAllocエントリの追加を支援する。図17の例は、ブロックへ追加する3つの新Allocエントリを必要とし、これらはD1、D2、及びD3に関連付けられた新たに定義された領域に対応する。D2のためのAllocエントリは割当て解除され、D1及びD3のためのAllocエントリが割当てられる。区分D1、D2、及びD3からなる領域に対応する古いAllocエントリのステータスは、それが置換されたことを指示するようにセットされる。置換済のステータスは、Allocエントリが本質的に対応領域を用いずに割当て解除されることを指示する。図14のブロック1201においてシステムはFileInfoレコードのための3つの領域を割当て、領域のアドレスを含むように変数R1、R2、及びR3をセットする。ブロック1202においてもしR->ステータスがATDRecentを指示していれば、システムはR1->時刻、R1->日付、及びR1->属性をR内の値にセットし、R1->ステータスをATDRecentにセットし、そうではない場合には、システムはこれらのフィールドをFNULLにしたままである。好ましい実施例では、FEProm管理者はAllocエントリを置換にセットするのと、Allocエントリを既存領域に割当てるのを支援する。ブロック1203においてシステムはある領域を新データに割当て、R2NewDataをその領域のアドレスにセットする。ブロック1204では、3つのAllocエントリが割当てられる。これらのエントリはD1、D2、及びD3を指し示すように初期化される。D1、D2、及びD3からなる領域を指し示すAllocエントリのステータスは置換にセットされる。ブロック1205においてシステムはR2NewDataによってアドレスされた新領域へnewdataを書込む。システムはブロック1206乃至1208AにおいてデータをFileInfoレコードR2内にセットする。ブロック1206においてシステムは、R2->ExtentPtrを新データのための領域を指し示すポインタに等しくセットする。ブロック1207では、R2->ExtentLenを新領域の長さに等しくセットする。ブロック1208においては、R2->PrimaryPtrがR3を指し示すポインタにセットされる。ブロック1208Aにおいてシステムは、ExtentPtr及びPrimaryPtrが有効であることを指示するようにR2->ステータスをセットする。図14の続きである図15のブロック1209乃至1211Aにおいてシステムは、データをFileInfoレコードR3内にセットする。ブロック1209ではD3領域を指し示すポインタに等しくR3->ExtentPtrをセットする。ブロック1210ではR3->ExtentLenをD3領域の長さに等しくセットする。ブロック1211においてシステムは、R3->PrimaryPtrをR->PrimaryPtrに等しくセットする。ブロック1211Aでは、ExtentPtr及びPrimaryPtrが有効であることを指示するようにR3->ステータスをセットする。ブロック1212乃至1214Aにおいてシステムは、データをFileInfoレコードR1内にセットする。ブロック1212ではD1領域を指し示すポインタに等しくR1->ExtentPtrをセットする。ブロック1213ではR1->ExtentLenをD3領域の長さに等しくセットする。ブロック1214においてシステムは、R1->PrimaryPtrをR2を指し示すポインタにセットする。ブロック1214Aでは、ExtentPtr及びPrimaryPtrが有効であることを指示するようにR1->ステータスをセットする。ブロック1215においては、R1を指し示すポインタに等しくなるようにR->SecondaryPtrがセットされる。ブロック1216では、SecondaryPtrが有効であることを指示するようにR->ステータスがセットされる。これでルーチンが終了する。図18及び19は、ファイル更新の特別な場合の結合のFileInfoリストを示す。これらの特別な場合を処理するためのルーチンは、図14、15に示したファイル更新の一般的な場合の処理に必要なルーチンの部分集合である。図18において、範囲の始まりから始まるデータが更新される。区分D11501は更新すべき範囲の始まりのデータを含み、区分D21502は更新されない範囲の終わりのデータを含む。2つの新FileInfoレコードだけが必要である。第1のFileInfoレコードR11511は新データ1503を指し示し、第2のFileInfoレコードR21512は区分D21502内の古いデータを指し示す。図19に示すように範囲境界上で終わるデータが更新される場合にも同様な状況が発生する。ファイル更新の一般的な場合のように、D1及びD2を含む古い領域は、古い領域を含むブロックに2つの新しい割当て表エントリを割当てることによって2つの領域に細分される。またもしエントリのために十分なスペースが存在しなければ、変更されないデータは新ブロックへ移動させられる。図20は更新データが範囲境界にまたがる場合のFileInfoレコードのためのリンクされたリストを示す。図21は、FEPromからディレクトリを削除するルーチンの流れ図である。ファイルを削除するルーチンは、対応付けられたFileInfoレコードが割当て解除されること以外は同一である。このルーチンは、DirEntryのステータスを、それが削除されることを指示するようにセットする。ブロック1801においてシステムは、削除すべきディレクトリを探知し、そのディレクトリのアドレスを含むように変数ポインタDをセットする。ブロック1802では、そのディレクトリを削除することを指示するようにD->ステータスをセットする。ディレクトリまたはファイルの名前は、新しいDirEntryまたはFileEntryをそれぞれ割当て、次いで新しいエントリを指し示すように古いエントリのSecondaryPtrをセットすることによって変更される。図23は、名前がBDATに変更される時の、DDATのためのファイルエントリを実線で、また変更を点線で示してある。新エントリはFileInfoエントリ、ディレクトリ構造、及び古いエントリに対応付けられた範囲のリンクされたリストを指し示す。図22はファイル名の変更を実現する好ましいサブルーチンの流れ図である。ディレクトリ名を変更するためのサブルーチンは、対応付けられる範囲が存在しないことを除いて同一である。このルーチンへの入力パラメタは、ファイルの同胞及び新ファイル名である。ブロック1901においてシステムはディレクトリを通してシステムを探索し、名前を変更すべきファイルを探知し、FileEntryを指し示すように変数Pをセットする。システムは、そのファイルのためのエントリのリンクされたリスト内の最後のFileEntryを探索する。ファイルは各名前変更毎にエントリを有する。ブロック1904においてシステムは、領域を新FileEntryに割当て、その領域を指し示すように変数Cをセットする。ブロック1905においてシステムはC->名前を新ファイル名に等しくセットし、C->属性、C->日付、C->時刻をセットし、ATDRecentに置換されるファイルエントリに基づいてC->ステータスをセットする。ブロック1906においてシステムは、C->SiblingPtrをP->SiblingPtrに等しくセットしてエントリをディレクトリ階層にリンクする。ブロック1909では、C->PrimaryPtrがP->PrimaryPtrに等しくセットされ、新エントリは範囲のリストにリンクされる。ブロック1909Aでは、ExtentPtr及びPrimaryPtrが有効であることを指示するためにC->ステータスがセットされる。ブロック1910ではシステムはCを指し示すポインタに等しくP->SecondaryPtrをセットする。ブロック1911においてシステムはSecondaryPtrが有効であることを指示するようにP->ステータスをセットし、古いエントリの置換を完了させてルーチンを終了させる。図24及び25は、あるファイルの属性データを変更するルーチンの流れ図である。あるファイルに関連する属性データは、ATDRecentのステータスを有し、また性、日付、及び時刻フィールドがFNULLにセットされている第1のFileInfoエントリを選択することによって変更される。もしこのようなフィールドが存在しなければ、新しいFileInfoエントリが創成され、選択される。次いでシステムは属性、日付、及び時刻フィールドを選択されたFileInfoエントリ内にセットする。先に最新の属性、日付、及び時刻データを記憶していたFileInfoエントリは、ATDSuperesededにセットされているステータスを有している。入力パラメタはパスネーム及び属性データである。ブロック2101においてシステムはディレクトリ構造を通して探索してファイルを探知し、FileEntryを指し示すように変数Pをセットする。ブロック2102においてもしP->ステータスがATDRecentを指示していれば、FileEntryは最新の属性データを含んでおり、システムはブロック2103に進み、そうでない場合にはシステムはブロック2104に進む。ブロック2103においてシステムは変数Xを変数Pにセットして図25のブロック2111に進む。ブロック2104ではシステムは変数CをP->PrimaryPtrに等しくセットする。システムはブロック2105乃至2108をループして最新の属性データを指示しているステータスを有するFileInfoエントリを探索する。ブロック2105においてもしSecondaryPtrが有効であることをC->ステータスが指示していれば、システムはブロック2106へ進み、そうでない場合はシステムはブロック2107へ進む。ブロック2106では変数CはC->SecondaryPtrにセットされて置換されるエントリを指し示すようにされ、ブロック2105へループバックされる。ブロック2107においてもしC->ステータスがATDRecentを指示していればFileInfoエントリは最新の属性データを含んでいるのであり、システムはブロック2109へ進み、そうでない場合にはシステムはブロック2108へ進む。ブロック2108においてシステムは変数CをC->PrimaryPtrに等しくセットし、ブロック2105へループバックする。ブロック2109においてはシステムは変数Xを変数Cにセットし、図25のブロック2111へ進む。システムは、ブロック2111において変数Yを変数Xに初期化する。変数Xは最新の属性データを有するエントリを指し示す。ブロック2112乃至2119においては、再新のステータスを有しFNULLにセットされた属性データを有する次のエントリを探知する。ブロック2112においてもしPrimaryPtrが有効であることをY->ステータスが指示していれば、システムはブロック2113へ進み、そうでなければ新エントリを追加するためにブロック2120へ進む。ブロック2113では、変数YはY->PrimaryPtrにセットされる。ブロック2114においてもしSecondaryPtrが有効であることをY->ステータスが指示していれば、システムはブロック2115へ進み、そうでなければブロック2116へ進む。ブロック2115では変数YがY->SecondaryPtrに等しくセットされ、ブロック2114へループバックされる。ブロック2116においてもしY->ステータスがATDRecentにセットされていればシステムはブロック2117へ進み、そうでなければブロック2112へ戻される。ブロック2117においてもしY->属性、Y->日付、及びY->時刻がFNULLに等しければシステムはブロック2118へ進み、そうでなければブロック2112へループバックされる。ブロック2118において、Y->属性、Y->日付及びY->時刻は新しい属性データにセットされる。ブロック2119ではX->ステータスがATDSupersededに等しくセットされ、ルーチンは完了する。ブロック2120乃至2123においてシステムは新FileInfoエントリを割当てて初期化する。ブロック2120では新FileInfoエントリが割当てられ、新エントリを指し示すように変数Zがセットされる。ブロック2121では、システムはZ->属性、Z->日付、及びZ->時刻を新属性データにセットし、Z->ステータスを存在、ATDRecent、及びFileInfoにセットし、Z->ExtentPtrをY->ExtentPtrにセットし、そしてZ->ExtentLenをY->ExtentLenにセットする。ブロック2122ではY->SecondaryPtrが変数Zに等しくセットされ、SecondaryPtrが有効であることを指示するようにY->ステータスがセットされる。ブロック2123では、X->ステータスがATDSupersededに等しくセットされ、エントリが最早現属性データを含んでいないことを指示し、ルーチンが完了する。以上に本発明を好ましい実施例に関して説明したが、本発明はこの実施例に限定されるものではない。当業者ならば本発明の思想に基づく多くの変更が明白であろう。本発明の範囲は特許請求の範囲によってのみ限定されるものである。