レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API テープ バックアップの概要

Microsoft(R) Windows(TM) では、 テープ ボリュームとは記録メディアとその物理的なキャリア (搬送物)を指します。ボリューム内のテープは、 その全体がすべてデータの記録に使えるというわけではありません。テープの先頭および終端にある短い部分は、 キャリアのハブにテープを付着させるために予約されています。テープ上でデータが記録できる部分の先頭の位置を「メディアの先頭」マーカー、 終端の位置を「メディアの終端」マーカーと呼びます。

テープ ボリュームは、 1つまたは複数のパーティションを持ちます。「パーティション」とはボリュームのある一部分のことを指し、 その先頭および終端の位置はほかのパーティションと重なることはありません。パーティションにはそれぞれ3つの位置が定義されています。パーティションの中でデータを記録できる先頭の位置を「パーティションの先頭」マーカー、 終端の位置を「パーティションの終端」マーカーと呼びます。「事前警告」位置とは「パーティションの終端」マーカーの直前にあるものです。事前警告位置は、 「パーティションの終端」に到達する前にバッファリングされているデータをテープに転送するようテープ アプリケーションに通知するためのものです。

パーティションの先頭から終端までの領域は、 通常「ファイルマーク」または「セットマーク」といういくつかのセクションに分割されます。ファイルマークおよびセットマークとは、 ユーザー データを含まず、 単にパーティションを小さな領域に分割してアドレス指定の機構を提供するための、 特殊な記録要素です。ファイルマークとセットマークはともに同じような目的で使われますが、 セットマークを使えば、 大容量テープ デバイスにおいてより高速な位置決めを行うことができます。

通常、 テープ デバイスはファイルマークとセットマークの両方をサポートしています。このため、 セットマークで異なるディスク ボリュームからのデータを分割し、 ファイルマークでディスク ボリュームの個々のファイルを分離することにより、 テープ データをフォーマットすることができます。

このほかに、 テープ上の位置を示す記録要素として「消去ギャップ」があります。消去ギャップとは、 デバイスがマークまたはユーザー データとして認識しない、 テープ上の消去領域またはパターンのことです。

ファイルマークには3種類あります。「短いファイルマーク」とは、 短い消去ギャップを含むファイルマークのことです。短い消去ギャップには、 パーティションの先頭またはそれより前の長いファイルマークから書き込み操作を行わないかぎり、 上書きできません。「長いファイル マーク」とは、 長い消去ギャップを含むファイル マークのことです。アプリケーションは、 ファイルマークの先頭にテープ位置を設定し、 ファイルマークと長い消去ギャップを上書きすることができます。「標準ファイルマーク」には消去ギャップが含まれません。ファイルマークを使用するテープ デバイスは、 短いファイルマークと長いファイルマーク、 または標準ファイルマークのいずれか一方をサポートしますが、 3つすべてをサポートすることはありません。

セットマーク間やファイルマーク間のパーティションの領域は、 データの記録に使うことができます。テープに対して読み書きを行うときのデータの単位は、 ブロックと呼ばれます。

テープ関数は、 Microsoft(R) Win32(R)アプリケーション プログラミング インターフェイス (API) で提供されており、 バックアップ アプリケーションがテープの読み書きや初期化、 テープまたはテープ ドライブの情報の取得などを行うことを可能にしています。

次の各トピックでは、 テープ バックアップについて説明します。

テープの初期化

テープに対するI/O

テープ バックアップの使用

POSIXファイル リンクのバックアップと復元

テープ バックアップ関数

テープの初期化

アプリケーションは、 CreateFile関数を使って、 テープデバイスのハンドルを作成しなければなりません。このハンドルは、 後でデバイス内にあるテープを操作する際に使います。

アプリケーションは、 テープに書き込みを行う前に、 アプリケーションによる要求と使用するテープ デバイスの能力に応じて、 テープをフォーマットしなければなりません。CreateTapePartition関数は、 テープを再フォーマットし、 指定されたサイズのパーティションを指定された数だけ作成します。

PrepareTape関数は、 これからアクセスするまたは取り外そうとするテープの準備をします。この関数を使って、 テープのロード、 アンロード、 ロック、 およびロック解除ができます。また、 この関数を使ってテープをメディアの終端かメディアの先頭まで巻き取ることにより、 テープのたるみを取ることができます。

アプリケーション テープまたはテープ ドライブに関する情報を取得または設定するには、 GetTapeParameters関数、 SetTapeParameters関数、 およびGetTapeStatus関数を使います。

GetTapeParametersは、 テープまたはテープ ドライブを記述する情報を取得します。テープ情報には、 テープの種類、 密度、 ブロック サイズ、 テープ上のパーティションの数、 テープの残量などがあります。テープ ドライブ情報には、 ドライブのデフォルトのブロック サイズ、 最大パーティション数、 サポートされている機能などがあります。

SetTapeParametersは、 テープのブロック サイズまたはテープ デバイス フラグを設定します。テープ デバイス フラグは、 デバイスがハードウェアによるエラー訂正、 データ圧縮、 データの埋め込み、 あるいはこれら3つの機能の任意の組み合わせをサポートしているかどうかを示すものです。

GetTapeStatusは、 テープ ドライブがテープ コマンドを処理するための準備ができているかどうかを示します。

テープに対するI/O

Win32 APIは、 テープ ドライブに対して入出力 (I/O) を行うことのできるさまざまな関数を提供しています。テープI/Oは、 通信デバイスに対するI/Oに似ています。

テープI/Oを扱う際は、 以下の点に注意してください。まず、 テープ ドライブの中には、 テープ上の最初の数ブロック (通常は最初の100ブロックの部分) にテープのファームウェア情報を格納するものがあります。アプリケーションはこのブロックは使わないようにしてください。このことについて詳しくは、 各テープ システムの製造元にお問い合わせください。一般に、 アプリケーションでテープ上の最初の100ブロックをスキップすれば、 テープ固有の特異性による影響を回避できます。

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

ReadFile関数およびWriteFile関数は、 テープからのデータの読み取り、 およびテープへのデータの書き込みをします。データは、 完全なブロック単位で読み書きされます。テープのブロック サイズが512バイトである場合は、 すべての読み書き操作はその整数倍のブロック サイズ (512 1024 1536 2048バイトなど) のバッファを使わなければなりません。必ずではありませんが、 たいていのテープ ドライブは、 テープを巻戻した後、 または読み取り操作によりデータの終端を示すエラー メッセージが生成された後だけ、 書き込み操作が許されます。

ReadFileがファイルマークを読み取ると、 ファイルマークまでのデータが読み取られ、 関数は失敗します (GetLastError関数は、 読み取ったファイルマークの種類を示すエラー コードを返します)。ファイルマーク以降も続けて読み取るには、 アプリケーションは、 テープをファイルマークよりも先に移動させてから、 もう一度ReadFileを呼び出さなければなりません。

ReadFileWriteFileは、 データ ストリームに対してだけ読み書きを行います。BackupReadBackupWrite関数は、 ファイルに関連付けられているすべてのストリームに対して読み書きを行います。このようなストリームには、 データ、 拡張属性、 セキュリティ、 および代替データ ストリームが含まれます。セキュリティと代替データ ストリームは、 New Technologyファイル システム (NTFS) におけるパーティションだけで扱われるものです。

BackupSeek関数は、 BackupReadまたはBackupWriteがアクセスしているファイルを順方向にシークします。これにより、 アクセス エラーを起こす原因となる情報をスキップすることが可能になります。

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

テープ バックアップ アプリケーションは、 BackupReadBackupWriteを使って、 ファイルに関連するすべての情報をコピーしなければなりません。しかし、 これらの関数は、 ファイルの属性や作成時刻などの特性に対しては読み書きしません。アプリケーションでこれらの値の問い合わせや設定を行うには、 GetFileAttributesSetFileAttributesなどのファイルI/O関数を使わなければなりません。

バックアップ アプリケーションの作成

Win32テープ関数の最も一般的な使い方は、 バックアップ アプリケーションの作成です。テープに対してI/O操作を行うには、 アプリケーションはまずテープ デバイスのハンドルを取得しなければなりません。次の例は、 CreateFileを使ったテープ デバイスのオープン方法を示したものです。

HANDLE hTape;/* handle to tape device */

hTape = CreateFile(
"\\\\.\\TAPE0",/* name of tape device to open */
GENERIC_READ | GENERIC_WRITE, /* read-write access */
0,/* not used*/
0,/* not used*/
OPEN_EXISTING,/* required for tape devices */
0,/* not used*/
NULL);/* not used*/

ディレクトリ ツリーをテープにバックアップするには、 まずFindFirstFile関数とFindNextFile関数を使ってディレクトリ ツリー全体を検索しなければなりません。アプリケーションは、 ファイルが見つかるたびにGetFileAttributes関数を使ってファイルの属性を取得します。ハード リンクの場合はそのリンク数を調べ、 後で比較するためにファイルの一意なIDをテーブルに保存しておきます。はじめてファイルが見つかったときは、 アプリケーションはCreateFileを使ってファイルをオープンし、 BackupRead関数を使ってバックアップを開始します。次に、 WriteFile関数を繰り返し使い、 BackupReadによりいっぱいになったバッファの情報をすべてテープに転送します。2度目にファイルが見つかったとき (ハード リンクされている場合はファイルIDのテーブルと照らし合わせてチェックされる) は、 単に一般的なファイル情報をテープに書き込み、 その後にIDBACKUP_LINKであるストリームに書き込むことができます。

テープからディスクにファイルを復元するには、 CreateFile BackupWrite、 およびReadFileの各関数を使わなければなりません。アプリケーションは、 テープ上の各ファイルについてCreateFileを使い、 ディスク上に新しいファイルを作成し、 BackupWriteを使ってファイルの復元を開始します。そして、 ファイルのすべての情報がテープからBuckupWriteバッファに読み取られるまで繰り返しReadFileを使います。BuckupWriteバッファのストリームの1つがBACKUP_LINKストリームIDを持っている場合は、 ハード リンクを確立しなければなりません。リンクを確立しているデータが存在しない場合には、 BackupWriteは失敗します。アプリケーションは、 既存のカタログを使って元のデータの格納位置を調べたり、 それらを復元したりできます。また、 復元するファイル データが異なる位置に格納されていることをユーザーに通知することもできます。

POSIXファイル リンクのバックアップと復元

バックアップ アプリケーションは、 BackupWrite関数を使ってPOSIXファイル リンクを再作成できます。

BackupRead関数は、 POSIXファイル リンク データを返しません。バックアップ アプリケーションは、 アプリケーション自身でリンク情報を管理しなければなりません。次の疑似コードは、 POSIX以外のファイル情報とともにPOSIXファイル リンク データをバックアップおよび復元するためのアルゴリズムを示したものです。

POSIXファイル リンクをバックアップするための疑似コード アルゴリズム

1.Initialize and empty a list of known links.
2.While there are more files to back up
3.Read the disk and get the next file.
4.Open the file for read.
5.Call GetFileInformationByHandle() to get the
NumberOfLinks and the FileIndex.
6.If the NumberOfLinks is greater than 1
7.Search the list of know links looking for
the same FileIndex.
8.If a match is NOT found
9.add the full path of the file and the
FileIndex to the list.
10.Call BackupRead() to copy all data to
your backup media.
10.Else
11.Mark the data as a LINK on your backup media
11.store the full path from the list
to your backup media.
12.Endif

13. Else
14.Call BackupRead() to copy all data to your
backup media.
15. Endif
16. EndWhile

POSIXファイル リンクを復元するための疑似コード アルゴリズム

1.While there are more files to restore
2.If the file is a LINK
3.use the full path which was saved as data
to open the file.
4.Initialize a WIN32_STREAM_ID structure with
dwStreamId equal to BACKUP_LINK.
5.Initialize the dwStreamAttributes to 0.
6.Initialize the dwStreamNameSize to 0.
7.Initialize a buffer containing the full path
of the file you are restoring in UNICODE.
8.Initialize the dwStreamSizeHigh to 0.
9.Initialize the dwStreamSizeLow to the size
in bytes of the buffercontaining the full path.
10.Call BackupWrite() with the WIN32_STREAM_ID
11.Call BackupWrite() with the buffer containing
the full path.
13.Else
14.Call BackupWrite() with the data stored on
your backup media.
15. Endif
16. EndWhile

テープ バックアップ関数

テープ バックアップで使われる関数を、 次に示します。

BackupRead

BackupSeek

BackupWrite

CreateTapePartition

EraseTape

GetTapeParameters

GetTapePosition

GetTapeStatus

PrepareTape

SetTapeParameters

SetTapePosition

WriteTapemark

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします