ファイル名

ここでは、次の事項について説明します。

ファイル命名規則

ファイルをCOBOLプログラム中で特定するために使用するファイル名は利用者語の一種であり、その命名規則は利用者後の規則に従います。 COBOL システムの外部では、ファイルの実体はシステムを実行するオペレーティングシステムの標準的なファイル命名規則を採用し、以下の4つの部分から成り立ちます。

ファイル名の最大長は 255文字となります。

COBOL システムにはこれ以上の制限はありませんが、オペレーティングシステムがファイルを正しく処理するためにはオペレーティングシステム側の制限があり得ますので、プログラムの実行時には考慮する必要があります。

ファイル命名規則では、次の点に注意してください。

ファイル名の割り当て

物理的なファイル名、または、実行時に物理的な名前にマップできる論理的なファイル名を指定するには、SELECT 句で ASSIGN 句を使用します。

ファイル名の割り当てには、次のような 3 種類の方法があります。

これら 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 を参照)。

例 1

次の例では、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.
例 2

この例では、引用符を使用して、ファイル名に空白文字が含まれるファイル 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 構文を使用した場合は外部参照として) が指定されている場合は、次のように実行されます。

  1. ファイル名の最初の要素を分離します。つまり、最初のバックスラッシュ文字 (\) より前にあるすべてのテキストを分離します。バックスラッシュ文字が含まれない場合は、テキスト全体を分離します。
  2. 最初の要素が 2 個のドル記号 ($$) で始まる (ファイルが Fileshare サーバ上にあることを示す) 場合、検索処理をその Fileshare サーバに切り替え、次の要素に対してファイル名のマッピング処理を続行します。
  3. 先頭にドル記号 ($) が存在する場合は、これを削除し、最初の要素に「dd_」という文字を追加して、この名前を持つ環境変数を検索します。
  4. この環境変数が見つからず、ASSIGN EXTERNAL 構文が使用されているか、またはファイル名がドル記号で始まる場合、この最初の要素 (ドル記号が先頭にある場合にはそのドル記号は除く) と同じ名前を持つ環境変数が検索されます。
  5. ファイル名がドル記号で始まり、少なくとも 1 個のバックスラッシュ文字を含む場合以外は、検索に失敗するとファイル名は変更されません。この場合には、最初の要素全体と最初のバックスラッシュが名前から削除されます。

この処理はファイル名の次の要素に対して行われ、名前のすべての要素が処理されるまで繰り返されます。この処理結果を物理ファイルのファイル名にします。

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.datd:¥aplbr¥aplbr.lbr¥app.dat に解決されます。

ライブラリは、環境変数に定義されている順序で検索されます。

プログラム呼び出しで検索されるパスの一部として、ライブラリ名を使用することもできます。 たとえば、次のようなコマンドを実行したとします。

set appath=d:¥apdir¥progs1.lbr;d:¥appdir¥progs2.lbr 

次の形式を使用できます。

call "$appath¥prog"

COBOL 開発システムは、ブログラム prog1で使用するライブラリとして、progs1.lbrprogs2.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)

外部ファイルマッパー (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 に設定してください。

関連情報
はじめに
ファイル編成
ファイル状態
ファイルの共有
ファイルハンドラの構成
ファイルハンドラおよびソート API
データとキーの圧縮
ファイル操作のトレース