ここでは、次の事項について説明します。
ファイルをCOBOLプログラム中で特定するために使用するファイル名は利用者語の一種であり、その命名規則は利用者後の規則に従います。 COBOL システムの外部では、ファイルの実体はシステムを実行するオペレーティング システムの標準的なファイル命名規則を採用し、以下の4つの部分から成り立ちます。
ファイル名の最大長は 255文字となります。
COBOL システムにはこれ以上の制限はありませんが、オペレーティング システムがファイルを正しく処理するためにはオペレーティング システム側の制限があり得ますので、プログラムの実行時には考慮する必要があります。
ファイル命名規則では、次の点に注意してください。
物理的なファイル名、または、実行時に物理的な名前にマップできる論理的なファイル名を指定するには、SELECT 句で ASSIGN 句を使用します。
ファイル名の割り当てには、次のような 3 種類の方法があります。
ASSIGN 句でファイル名を文字列定数として指定します。
ASSIGN 句でファイル名をデータ項目として指定するので、実行時にプログラムで変更できます。
ASSIGN 句でファイル名を EXTERNAL として指定し、実行時に決定します。
これら 3 種類すべてのファイル名の割り当て方法でファイル名の実行時マッピングを使用できます。
ファイル名の静的割り当てでは、ファイル名を SELECT 句で定数として指定します。
select filename assign to literal.
作成している物理ファイルのファイル名に空白文字を使用すると、そのファイル名は自動的に引用符で囲まれます。
次の例では、stockfile を開くと、b: ドライブの現在のディレクトリにある warehs.buy ファイルが開きます。
select stockfile assign to "b:warehs.buy".
次の例では、WRITE 文を使用すると、最初のパラレルプリンターである prn: にデータが出力されます。
select printfile assign to "prn:".
次の例では、input-file を開くと、現在のディレクトリに相対的な data ディレクトリの prog ファイルが開きます。
select input-file assign to "data\prog".
ファイル名の動的割り当てでは、ファイル名を SELECT 句で COBOL データ項目として指定します。
select filename assign to dynamic data-item
パラメーターの内容は、次のとおりです。
filename | 割り当てるファイルのファイル名 |
data-item | COBOL データ項目の名前。プログラムでデータ項目が明示的に宣言されていない場合は、PICTURE 句 PIC X(255) を使用して、コンパイラがデータ項目を自動的に作成します。ファイルに対して OPEN 文を実行する前に、プログラムでデータ項目の値を指定する必要があります。 |
作成している物理ファイルのファイル名に空白文字を含める場合は、ファイル名を引用符で囲む必要があります (下記の例 2 を参照)。
次の例では、input.dat というファイルが現在のディレクトリに作成されます。
... select fd-in-name assign to dynamic ws-in-file. ... working-storage section. 01 ws-in-file pic x(30). ... move "input.dat" to ws-in-file. ... open output fd-in-name.
この例では、引用符を使用して、ファイル名に空白文字が含まれるファイル spacey filename.dat を作成しています。
select f1 assign to dynamic f1-name. ... working-storage section. 01 f1 pic x(30). ... move """spacey filename.dat""" to f1-name .... open output f1.
注:ASSIGN"DYNAMIC" コンパイラ指令を使用する場合は、ASSIGN 句の DYNAMIC という語を省略できます。
ファイル名の外部割り当てでは、ファイル名を SELECT 句で次のように指定します。
select filename assign to external external-file-reference
パラメーターの内容は、次のとおりです。
filename | 割り当てるファイルのファイル名 |
external-file-reference | 外部環境に指定されたファイルでさらにマッピングが可能かどうかを識別する COBOL 語。external-file-reference に 1 つ以上のハイフン (-) が含まれる場合は、最後のハイフンまでのすべての文字が無視されます。 |
ランタイム システムのファイル名マッピングの詳細については、『ファイル名のマッピング』の項を参照してください。
開くファイルの名前には、ライブラリ名を含めることができます。ファイル名は次の形式で指定します。
device\library-name.lbr\filename.ext
c:¥appdir¥applib.lbr¥app.dat
このタイプのファイル名は、OPEN INPUT 構文か CBL_OPEN_FILE バイトストリームルーチンを使用して、読み込み専用モードでデータファイルを開く場合のみ有効です。指定したライブラリが開いていない場合、この呼び出しによって指定されたデバイス上でライブラリが開かれます。呼び出しが終了しても、ライブラリは閉じられません。指定したライブラリが存在しない場合や、ライブラリ内に指定した filename.ext が存在しない場合には、ファイルが見つからない旨のエラーが返されます。
この COBOL システムには、プログラムで ASSIGN 句を使用して指定したファイル名を別の名前にマップする方法が複数あるので、実行時に柔軟に対応できます。これらの方法では環境変数を使用します。
次の説明で使用する「環境変数」には、外部ファイル マッパーを通して有効化された Micro Focus の拡張環境変数も含まれます (『外部ファイル マッパー (Mfextmap)』の項を参照)。
プログラムを実行する前に、オペレーティング システムの SET コマンドを実行して、使用する環境変数に適切な値を指定する必要があります。次に例を示します。
set dir=d2
ファイル ハンドラーにファイル名 (定数、データ項目の内容、または ASSIGN TO EXTERNAL 構文を使用した場合は外部参照として) が指定されている場合は、次のように実行されます。
この処理はファイル名の次の要素に対して行われ、名前のすべての要素が処理されるまで繰り返されます。この処理結果を物理ファイルのファイル名にします。
例
ASSIGN 句のファイル名 | 検索対象の環境変数 | 環境変数の内容 | 物理ファイルのファイル名 |
---|---|---|---|
dir\file1 | dd_dir | d2 | d2\file1 |
$dir\file1 | dd_dir;dir | d2\d4 | d2\d4\file1 |
dir1\dir2\file1 | dd_dir1 | d4 | d4\dir2\file1 |
$dir1\$dir2\file1 | 1 回目の繰り返し: dd_dir1;dir1、2 回目の繰り返し: dd_dir2;dir2 | dd_dir1 または dir1: d2\d4 dd_dir2 または dir2: d3 | d2\d4\d3\file1 |
file1 | dd_file1 | d2 | d2 |
ファイル名のマッピングに使用する環境変数は、複数のパス名を指します。そのため、環境変数が指定した最初のパスに対して「ファイルが見つかりません。」という状態が返されると、システムは次のファイルを検索します。
次のような dd_dir という名前の環境変数があると仮定します。
dd_dir=\a\b;\c\d;
このときに、\a\b に対して「ファイルが見つかりません。」という状態が返されると、システムは、割り当てられたファイルを \c\d で検索します。
複数のパス環境変数に、ライブラリ名を含めることができます。 たとえば、次のようなコマンドを実行したとします。
set test=c:¥apdir;d:¥aplbr¥aplbr.lbr;d:¥aplbr¥aplbr1.lbr
c:¥apdir¥app.dat が存在しない場合には、ファイル名 $test¥app.dat はd:¥aplbr¥aplbr.lbr¥app.dat に解決されます。
ライブラリは、環境変数に定義されている順序で検索されます。
プログラム呼び出しで検索されるパスの一部として、ライブラリ名を使用することもできます。 たとえば、次のようなコマンドを実行したとします。
set appath=d:¥apdir¥progs1.lbr;d:¥appdir¥progs2.lbr
次の形式を使用できます。
call "$appath¥prog"
COBOL 開発システムは、ブログラム prog1で使用するライブラリとして、progs1.lbr と progs2.lbr を検索します。ライブラリは、環境変数に定義されている順序で検索されます。検索したライブラリは、実行中のアプリケーションによって明示的に閉じられるまで開いたままです。
プリンターに直接レポートを送信する、または通信ポートを通してデータを転送するための COBOL プログラムを作成できます。そのためには、COBOL ファイル名にデバイス名を割り当てる必要があります。
次に示すデバイス名は、ファイル名の静的割り当て、動的割り当て、または外部割り当てを使用して指定できます。
デバイス名 | 説明 |
---|---|
CON | コンソールキーボードまたは画面 |
PRN | 最初のパラレルプリンター |
LPT1 | 最初のパラレルプリンター |
LPT2 | 2 番目のパラレルプリンター |
LPT3 | 3 番目のパラレルプリンター |
COM1 | 最初の非同期通信ポート |
COM2 | 2 番目の非同期通信ポート |
これらのデバイス名を指定するときに、オプションで末尾にコロン (:) を指定できます。
次の例では、fd-name への読み書き操作を行うと、コンソール画面でデータの読み書きが行われます。
select fd-name assign to "con".
この例では、fd-name へ書き込み操作を行うと、データが最初のパラレルプリンターである lpt1: へ出力されます。
select fd-name assign to dynamic ws-filename. ... move "lpt1:" to ws-filename.
COBOL ファイル構文を使用して、別のプロセス (dir コマンドなど) を起動し、そのプロセスの標準入力にデータを書き込んだり、そのプロセスの標準出力からのデータを読み込んだりできます。 この場合には、COBOL ファイル編成は、行順またはレコード順のどちらかである必要があります。
プロセスを起動し、データを標準入力に書き込むためには、ファイル名の > 記号の後にコマンド名を続ける必要があります。 ファイルは、出力ファイルとして開く必要があります。
次に例を示します。
select output-file assign to ">cmd /c sort" organization is line sequential. fd output-file. 01 output-file-record pic x(10). procedure division. open output output-file write output-file-record from "Charles" write output-file-record from "Bill" write output-file-record from "Alan" close output-file.
プロセスを起動し、標準出力からデータを読み込むには、ファイル名の "lt" 記号の後にコマンド名を続ける必要があります。 ファイルは、入力ファイルとして開く必要があります。
次に例を示します。
select input-file assign to "<cmd /c dir" organization is line sequential. ... open input input-file read input-file
この例では、プログラムは dir プロセスを起動し、そのプロセスが標準出力に書き込む最初の行を読み込みます。
双方向パイプは、入力パイプと出力パイプの機能を組み合わせたものです。 双方向パイプを使用するには、ファイル名のパイプ記号 (|) の後にコマンド名を続ける必要があります。ファイルは、入出力両用ファイルとして開く必要があります。
次に例を示します。
select i-o-file assign to "| cmd /c sort" organization is line sequential. fd i-o-file. 01 i-o-file-record pic x(20). procedure division. open i-o i-o-file write i-o-file-record from "Hello world" write i-o-file-record from all "A" write i-o-file-record from all "Z" write i-o-file-record from x"1a" perform until exit read i-o-file at end exit perform end-read display i-o-file-record end-perform close i-o-file
この例では、プログラムは sort プロセスを起動して、3 行目までとその後ろのファイルの終わりマーカーを標準出力に渡します。その後に、sort プロセスの標準出力から 3 行すべてを読み込みます。
外部ファイル マッパー (Mfextmap) を使用すると、外部でファイル名を割り当てることができます。 この方法では、ファイル名のマッピングをテキストファイル (マッパー ファイル) で処理できるため、COBOL プログラムで使用するファイル名を物理的なファイル名に柔軟にマップできます。 ファイル名のマッピングは、後でファイルを編集するだけで変更できます。
select filename assign to external assigned-name
パラメーターの内容は、次のとおりです。
filename | プログラムで使用する論理 (内部) ファイル名 |
assigned-name | マッパー ファイルのエントリ |
外部ファイル マッパーを使用すると、オペレーティング システムの環境変数でファイル名の割り当てを決定する場合より、環境領域に必要なメモリ量を削減できます。
外部ファイル マッパーを使用するには、通常のテキストファイルを作成し (メモ帳などのテキストエディタを使用して作成)、mfextmap.dat という名前を付ける必要があります。
このファイルの各行に、次のような形式で割り当てるファイル名を記述します。
assigned-name physical-name
パラメーターの内容は、次のとおりです。
assigned-name | プログラムで使用される割り当てファイル名 |
physical-name | 物理ファイルの実際の名前。パス名を含む。 |
このファイルでは、次の点に注意してください。
プログラムの実行中にマッパー ファイルの内容を変更できます。 使用されるマッピング情報は、常に、現在のバージョンのマッパー ファイルに保存された情報です。
マッパー ファイルを作成する場合は、このファイルを mfextmap.dat と命名し、次のどこかに格納する必要があります。
MFEXTMAP と COBDIR は、どちらも複数のパスを定義できます。
MFEXTMAP が設定されていても、指定するディレクトリにマッパー ファイルが存在しない場合には、システムは、プログラムで使用する割り当てファイル名と同じ名前の環境変数を検索し、ファイル名を決定しようとします。
MFEXTMAP が設定されていない場合には、システムは、まず現在のディレクトリでマッパー ファイルを検索します。ここで見つからないと、次に COBDIR パスに従って検索します。 マッパー ファイルが見つからない場合には、システムはプログラムで使用する割り当てファイル名と同じ名前の環境変数を検索し、ファイル名を決定しようとします。
外部ファイル マッパーを使用するには、次を実行する必要があります。
次に、外部ファイル マッパーを有効化するために、ランタイム チューナー environment_mapper を TRUE に設定します。 次のように設定します。
set environment_mapper=TRUE
COBCONFIG_ 環境変数で指定された構成ファイルに追加します。
ランタイム チューナーの詳細については、ヘルプトピック『ランタイム チューナー』を参照してください。
外部ファイル マッパーを無効化すると、ディスクにアクセスして現在のバージョンのマッパー ファイルを検索する必要がなくなるため、システムの処理速度が向上します。
外部ファイル マッパーを無効化するには、ランタイム チューナー environment_mapper を FALSE に設定してください。