テープ入力と出力

アプリケーションがテープ ドライブ上で入出力 (I/O) を実行するために使用できる関数がいくつかあります。 テープ I/O は、通信デバイスで実行される I/O に似ています。

テープ I/O を実行する場合、一部のテープ ドライブは、テープの最初の数ブロックにテープ ファームウェア情報を保存します。通常、最初の 100 ブロックの一部が使用されます。 アプリケーションでは、これらのブロックを使用しないでください。 この問題に関するより具体的な情報は、個々のテープ システムの製造元から入手できます。 一般に、テープ上の最初の 100 ブロックをスキップするアプリケーションは、テープ ドライブの特異性を回避します。

GetTapePosition 関数と SetTapePosition 関数は、現在のテープ位置を取得して移動します。 WriteTapemark 関数は、指定した数の設定マーク、ファイル マーク、短いファイル マーク、および長いファイル マークを書き込みます。 EraseTape 関数は、テープの全部または一部を消去します。

ReadFile 関数と WriteFile 関数は、テープとの間でファイル データの読み取りと書き込みを行います。 データは読み取られ、完全なブロックで書き込まれます。 テープのブロック サイズが 512 バイトの場合、すべての読み取りおよび書き込み操作では、そのブロック サイズの単純な整数倍 (512、1024、1536、2048 など) のバッファを使用する必要があります。 すべてではないにしても、ほとんどのドライブでは、テープが巻き戻された後、または読み取り操作でデータ終了エラー メッセージが生成された後にのみ書き込み操作が許可されます。

可変長ブロック モードでテープにファイル データを読み書きするには、次の手順を実行します。

  1. GetTapeParameters 関数を呼び出し、返された TAPE_GET_DRIVE_PARAMETERS 構造体の FeaturesLow メンバーのTAPE_DRIVE_VARIABLE_BLOCK ビットをチェックして、テープ ドライブが可変長ブロック モードをサポートしているかどうかを判断します。
  2. SetTapeParameters 関数を呼び出し、TAPE_SET_MEDIA_PARAMETERS 構造体の BlockSize メンバーを 0 に設定して、可変ブロック サイズ モードを指定します。 次に、ReadFile または WriteFile を使用して、ファイル データの読み取りまたは書き込みを行います。

ReadFile でファイルマークが検出された場合、ファイルマークまでのデータが読み取られ、関数は失敗します。 (GetLastError 関数は、検出されたファイル マークの種類を示すエラー コードを返します。オペレーティング システムは、ファイル マークを超えてテープを移動し、アプリケーションは ReadFile をもう一度呼び出して読み取りを続行できます。

ReadFileWriteFile は、データ ストリームのみを読み書きします。 BackupRead 関数とBackupWrite 関数は、ファイルに関連付けられているすべてのストリームの読み取りと書き込みを行います。 これらには、データ、拡張属性、セキュリティ、代替データ ストリームが含まれます。 セキュリティおよび代替データ ストリームは、NTFS ファイル システム パーティションにのみ関連します。

BackupSeek 関数は、BackupRead または BackupWrite によって最初にアクセスされたファイル内で転送をシークします。 この関数を使用すると、アプリケーションはアクセス エラーの原因となる情報をスキップできます。

アプリケーションがファイル データにのみアクセスする必要がある場合は、ReadFileWriteFile を使用する必要があります。 これらの関数は、CreateFile 関数を使用してストリームが作成された場合に、代替データ ストリームを読み取ることもできます。

テープ バックアップ アプリケーションでは、BackupReadBackupWrite を使用して、ファイルに関連するすべての情報をコピーする必要があります。 ただし、これらの関数は、属性やファイル作成時間などのファイル特性の読み取りまたは書き込みを行いません。 アプリケーションでは、GetFileAttributesSetFileAttributes などのファイル入力および出力関数を使用して、これらの値を取得および設定する必要があります。