OV_FILE_SERVICE

注意: 組み込み関数の規則

基本的なファイル・サービスおよびディレクトリ・サービスを実行します。 

Windows パス名はすべて環境変数置換をサポートします。

この組み込み関数の実行プラットフォームにより、使用されるファイル名およびパスは大文字と小文字が区別されます。例えば、IBM i の IFS の以下の特定の領域では大文字と小文字が区別されます。

この OV 組み込み関数は LANSA のプログラムで利用されているものなので、修正しないようにしてください。この組み込み関数をカスタマイズする場合は、このコピーを作成し、それを修正するようにしてください。

この組み込み関数は、アプリケーションへの影響を考慮した上でユーザーの責任において使用してください。明示的か暗黙的かを問わず、いかなる保証もありません。免責事項全文を参照してください。

ファンクション番号:

992

必要なDLL:

U_BIF992.DLL

各製品の対応

Visual LANSA for Windows

使用可

Visual LANSA for Linux

使用可

LANSA/AD

使用可(RDMLXのみで使用可能)

引数

番号

タイプ

必須/任意

説明

最小長

最大長

最小小数桁数

最大小数桁数

1

A

必須

必要なファイル・サービスのタイプ。以下のいずれかの値として渡します。

MAKE_DIR  ディレクトリを作成する

REMOVE_DIR  ディレクトリを削除する

REMOVE_DIR_TREE  ディレクトリのツリーを再帰的に削除する。注意して使用すること!

CHECK_DIR  ディレクトリが存在するかどうかを検査する

CHECK_FILE  ファイルが存在するかどうかを検査する

SET_FILE  ファイルの属性を読み取り専用または標準(読み書き可能)に設定する

COPY_FILE  ファイルを別のファイルにコピーする

REMOVE_FILE  ファイルを削除する

GET_DIR  ディレクトリの内容を取得する

COPY_DIR  ディレクトリとそのすべてのサブディレクトリを別のディレクトリにコピーする。コピー先ディレクトリに同じファイルがある場合は置き換える

COPY_PATTERN  指定されたパターンに一致するファイルを別のディレクトリにコピーする。コピー先ディレクトリに同じファイルがある場合は置き換える

1

256



2

A

任意

要求サービス引数1

引数1の値

      この引数で渡す値:

MAKE_DIR  作成するディレクトリの名前

REMOVE_DIR_TREE  削除するディレクトリの名前

REMOVE_DIR  削除するディレクトリの名前

CHECK_DIR  存在するかどうかを検査するディレクトリの名前

CHECK_FILE  存在するかどうかを検査するファイルの名前

SET_FILE  属性を設定するファイルの名前

COPY_FILE  コピー元ファイルの名前

REMOVE_FILE  削除するファイルの名前

GET_DIR  内容を取得するディレクトリの名前

COPY_DIR  コピー対象のディレクトリの名前

COPY_PATTERN  コピー対象のファイル・パターンを持つ完全修飾パス。サポートされるワイルドカードは*のみ

1

256



3

A

任意

要求サービス引数2

引数1の値

      この引数で渡す値:

MAKE_DIR  不要。渡さない

REMOVE_DIR  不要。渡さない

REMOVE_DIR_TREE  任意 (MS Windows と Linux のみサポート)。

ファイルが読み取り専用であったとしても、FORCE を引き渡すことで全ファイルを削除します。その他の値、または値がない場合、ファイルが読み取り専用であれば、エラーが返されます。 

CHECK_DIR  不要。渡さない

CHECK_FILE  不要。渡さない

SET_FILE  READ_ONLYまたはNORMAL

COPY_FILE  コピー先のファイルの名前

REMOVE_FILE  任意指定(32ビットMS Windowsでのみサポート)

読み取り専用のファイルも含め、すべてのファイルを削除するにはFORCEを渡します。その他の値を指定した場合、または値を指定しない場合は、ファイルが読み取り専用のときにエラーが返されます。 

GET_DIR  ディレクトリの内容を取得する際に、特定タイプのファイルのみを選択するための任意指定のファイル接尾辞(例:DLL、EXE、DOC)
すべてのファイルを選択するために、ブランクとして渡さないでください。

COPY_DIR  コピー先ディレクトリの名前

COPY_PATTERN  コピー先ディレクトリの名前

1

256



戻り値

番号

タイプ

必須/任意

説明

最小長

最大長

最小小数桁数

最大小数桁数

1

A

任意

基本戻りコード

OK = 正常に完了した 
ER = エラーが発生した

2

2



2

N

任意

拡張エラー・コード。これは、(使用可能な場合は)エラー処理またはエラー・レポートに役立つオペレーティング・システムのエラー・コードです。

1

15

0

0

3

リスト

任意

返された作業リスト

このリストは、引数1が特定の値の場合のみ以下のように返されます。 

MAKE_DIR  返されない

REMOVE_DIR  返されない

REMOVE_DIR_TREE  返されない

CHECK_DIR  返されない

CHECK_FILE 返されない

SET_FILE  返されない

COPY_FILE  返されない

REMOVE_FILE  返されない

GET_DIR  ディレクトリの内容を保持する作業リスト。この作業リストは1~7個のフィールド(すなわち列)で構成でき、完全なファイル名として返されます。 
それらは以下の通りです。 

ファイル名(接尾辞なし) 
ファイル接尾辞 
ファイル日付(形式YYYYMMDD) 
ファイル時刻(形式HHMMSS) 
ファイル・サイズ(数値フィールド) 
(サブ)ディレクトリ・インジケータ(YまたはNとして返される) 
実際の名前(完全なファイル名) 

この作業リストの既存の内容は、この組み込み関数によってクリアされます。詳細については、以下の例を参照してください。 

COPY_DIR  返されない

COPY_PATTERN  返されない





例 

以下のRDMLファンクションの例(CS/400の自由形式のファンクション・エディターにコピー/貼り付け可能)は、ディレクトリ名を指定するよう要求し、指定されたディレクトリを作成しようとします。ディレクトリの作成操作による基本戻りコードと拡張戻りコードが表示されます。 

     FUNCTION OPTIONS(*DIRECT)
DEFINE FIELD(#OV_DIRECT) TYPE(*CHAR) LENGTH(65)
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
DEFINE FIELD(#OV_ERRNO) TYPE(*DEC) LENGTH(7) DECIMALS(0) EDIT_CODE(4)
BEGIN_LOOP
MESSAGE MSGTXT('Specify name of directory to be created')
REQUEST FIELDS((#OV_DIRECT *NOID))
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(MAKE_DIR #OV_DIRECT) TO_GET(#OV_RETC #OV_ERRNO)
MESSAGE MSGTXT('Response from OV_FILE_SERVICE')
POP_UP FIELDS(#OV_RETC #OV_ERRNO)
END_LOOP

 以下のRDMLファンクションの例(CS/400の自由形式のファンクション・エディターにコピー/貼り付け可能)は、C:OV_DEMOというディレクトリを作成し、このディレクトリ内にディレクトリA、B、C、およびDを作成します。その後、作成したすべてのディレクトリを破棄します。削除(破棄)するためにはディレクトリが空である必要があるため、破棄操作は作成と逆の順序で実行されます。 

     FUNCTION OPTIONS(*DIRECT)
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(MAKE_DIR 'C:\OV_DEMO')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(MAKE_DIR 'C:\OV_DEMO\A')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(MAKE_DIR 'C:\OV_DEMO\B')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(MAKE_DIR 'C:\OV_DEMO\C')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(MAKE_DIR 'C:\OV_DEMO\D')
MESSAGE MSGTXT('Directories all created .... use OK to delete them now')
POP_UP FIELDS((#DATE *L3 *P2)) AT_LOC(8 23) WITH_SIZE(55 10) EXIT_KEY(*NO) MENU_KEY(*NO) PROMPT_KEY(*NO)
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(REMOVE_DIR 'C:\OV_DEMO\A')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(REMOVE_DIR 'C:\OV_DEMO\B')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(REMOVE_DIR 'C:\OV_DEMO\C')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(REMOVE_DIR 'C:\OV_DEMO\D')
EXECUTE SUBROUTINE(DIRECT) WITH_PARMS(REMOVE_DIR 'C:\OV_DEMO')
MESSAGE MSGTXT('Directories all deleted .... use OK to end this function')
POP_UP FIELDS((#DATE *L3 *P2)) AT_LOC(8 23) WITH_SIZE(55 10) EXIT_KEY(*NO) MENU_KEY(*NO) PROMPT_KEY(*NO)

SUBROUTINE NAME(DIRECT) PARMS((#OV_SERV *RECEIVED) (#OV_DIRECT *RECEIVED))
DEFINE FIELD(#OV_SERV) TYPE(*CHAR) LENGTH(20)
DEFINE FIELD(#OV_DIRECT) TYPE(*CHAR) LENGTH(65)
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
DEFINE FIELD(#OV_ERRNO) TYPE(*DEC) LENGTH(7) DECIMALS(0) EDIT_CODE(4)
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(#OV_SERV #OV_DIRECT) TO_GET(#OV_RETC #OV_ERRNO)
IF COND('#OV_RETC *NE OK')
DISPLAY FIELDS(#OV_SERV (#OV_DIRECT *NOID) #OV_RETC #OV_ERRNO) EXIT_KEY(*NO) MENU_KEY(*NO) PROMPT_KEY(*NO)
ABORT MSGTXT('Directory Operation failed')
ENDIF
ENDROUTINE

以下のRDMLファンクションの例(CS/400の自由形式のファンクション・エディターにコピー/貼り付け可能)は、ディレクトリ名を指定するよう要求します。指定されたディレクトリ名が存在しない場合、そのディレクトリを作成するかどうかを指定するよう指示します。 

     FUNCTION OPTIONS(*DIRECT)
DEFINE FIELD(#OV_DIRECT) TYPE(*CHAR) LENGTH(70)
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
DEFINE FIELD(#OV_MBA) TYPE(*CHAR) LENGTH(1)
BEGIN_LOOP
REQUEST FIELDS((#OV_DIRECT *NOID))
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(CHECK_DIR #OV_DIRECT) TO_GET(#OV_RETC)
IF COND('#OV_RETC = OK')
MESSAGE MSGTXT('This directory already exists')
ELSE
USE BUILTIN(OV_MESSAGE_BOX) WITH_ARGS('Do you want to create this directory ?' 'Create ?' YN Q) TO_GET(#OV_MBA)
IF COND('#OV_MBA = Y')
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(MAKE_DIR #OV_DIRECT) TO_GET(#OV_RETC)
IF COND('#OV_RETC *NE OK')
MESSAGE MSGTXT('Attempt to create directory failed')
ENDIF
ENDIF
ENDIF
END_LOOP

以下のRDMLファンクションの例(CS/400の自由形式のファンクション・エディターでコピーして貼り付けることが可能)は、ファイル名を指定するよう要求し、指定されたファイルが存在するかどうかを示します。 

     FUNCTION OPTIONS(*DIRECT)
DEFINE FIELD(#OV_DIRECT) TYPE(*CHAR) LENGTH(70)
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
BEGIN_LOOP
MESSAGE MSGTXT('Specify name of file whose existence is to be checked for')
REQUEST FIELDS((#OV_DIRECT *NOID))
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(CHECK_FILE #OV_DIRECT) TO_GET(#OV_RETC)
IF COND('#OV_RETC = OK')
MESSAGE MSGTXT('This file exists')
ELSE
MESSAGE MSGTXT('This file does NOT exist')
ENDIF
DISPLAY FIELDS((#OV_DIRECT *NOID))
END_LOOP

以下のRDMLファンクションの例(CS/400の自由形式のファンクション・エディターにコピー/貼り付け可能)は、ファイル名と、そのファイルを読み取り専用に設定するか標準(読み書き可能)に設定するかを指定するよう要求します。 

     FUNCTION OPTIONS(*DIRECT)
DEFINE FIELD(#OV_FILE) TYPE(*CHAR) LENGTH(70)
DEFINE FIELD(#OV_READ) TYPE(*CHAR) LENGTH(1) LABEL('Read Only') INPUT_ATR(RB01) DEFAULT(1)
DEFINE FIELD(#OV_NORM) TYPE(*CHAR) LENGTH(1) LABEL('Normal') INPUT_ATR(RB01) DEFAULT(0)
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
**********
BEGIN_LOOP
MESSAGE MSGTXT('Specify name of file whose attribute is to be changed and select attribute')
REQUEST FIELDS((#OV_FILE *L3 *P2 *NOID) (#OV_READ *L5 *P3) (#OV_NORM *L7 *P3))
IF COND('#ov_read = ''1''')
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(SET_FILE #OV_FILE READ_ONLY) TO_GET(#OV_RETC)
ELSE
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(SET_FILE #OV_FILE NORMAL) TO_GET(#OV_RETC)
ENDIF
IF COND('#OV_RETC = OK')
MESSAGE MSGTXT('File attribute successfully changed')
ELSE
MESSAGE MSGTXT('ERROR : File attribute was NOT changed')
ENDIF
END_LOOP

以下のRDMLファンクションの例(CS/400の自由形式のファンクション・エディターにコピー/貼り付け可能)は、コピー元ファイル名とコピー先ファイル名を指定するよう要求し、コピー操作を試行します。 

     FUNCTION OPTIONS(*DIRECT)
DEFINE FIELD(#OV_FROM) TYPE(*CHAR) LENGTH(60) DEFAULT('C:\CONFIG.SYS')
DEFINE FIELD(#OV_TO) TYPE(*CHAR) LENGTH(60) DEFAULT('C:\CONFIG.SAV')
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
**********
BEGIN_LOOP
MESSAGE MSGTXT('Specify the from and to file names')
REQUEST FIELDS(#OV_FROM #OV_TO)
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(COPY_FILE #OV_FROM #OV_TO) TO_GET(#OV_RETC)
IF COND('#OV_RETC = OK')
MESSAGE MSGTXT('File copied')
ELSE
MESSAGE MSGTXT('ERROR : File was NOT copied correctly')
ENDIF
END_LOOP

以下のRDMLファンクションの例は、ディレクトリ名を指定するよう要求し、指定されたディレクトリの内容を取得して表示します。結果として表示される内容は、さまざまな順序でソートできます。この例は、CS/400の自由形式のエディターにコピーして貼り付けることができますが、長いREQUESTコマンドを「展開」しないと、ファンクションが有効なRDMLコードとして受け入れられない場合があります。 

     FUNCTION OPTIONS(*DIRECT)
DEFINE FIELD(#OV_DIRECT) TYPE(*CHAR) LENGTH(70)
DEFINE FIELD(#OV_FILTER) TYPE(*CHAR) LENGTH(3) LABEL('Optional Filter')
DEFINE FIELD(#OV_BYTES) TYPE(*DEC) LENGTH(9) DECIMALS(0) LABEL('Total of Sizes') EDIT_CODE(3)
DEFINE FIELD(#OV_OBJECT) TYPE(*DEC) LENGTH(7) DECIMALS(0) LABEL('Total Objects') EDIT_CODE(3)
DEF_COND NAME(*OBJECTS) COND('#ov_object *gt 0')
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
DEFINE FIELD(#OV_ERRN) TYPE(*DEC) LENGTH(15) DECIMALS(0)
DEFINE FIELD(#OV_NAME) TYPE(*CHAR) LENGTH(15)
DEFINE FIELD(#OV_PREFIX) TYPE(*CHAR) LENGTH(12)
DEFINE FIELD(#OV_SUFFIX) TYPE(*CHAR) LENGTH(3)
DEFINE FIELD(#OV_DATE) TYPE(*CHAR) LENGTH(8)
DEFINE FIELD(#OV_TIME) TYPE(*CHAR) LENGTH(6)
DEFINE FIELD(#OV_ISDIR) TYPE(*CHAR) LENGTH(1)
DEFINE FIELD(#OV_SIZE) TYPE(*DEC) LENGTH(9) DECIMALS(0) EDIT_CODE(3)
DEFINE FIELD(#OV_PB01) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB01) DEFAULT('''Order By Name''')
DEFINE FIELD(#OV_PB02) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB02) DEFAULT('''Order By Suffix''')
DEFINE FIELD(#OV_PB03) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB03) DEFAULT('''Order By Date/Time''')
DEFINE FIELD(#OV_PB04) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB04) DEFAULT('''Order By Size''')
DEF_LIST NAME(#WLIST) FIELDS(#OV_NAME #OV_PREFIX #OV_SUFFIX #OV_DATE #OV_TIME #OV_SIZE #OV_ISDIR) TYPE(*WORKING) ENTRYS(5000)
DEF_LIST NAME(#DLIST) FIELDS(#OV_NAME #OV_PREFIX #OV_SUFFIX #OV_DATE #OV_TIME #OV_SIZE #OV_ISDIR) COUNTER(#OV_OBJECT)
**********
EXECUTE SUBROUTINE(WTOD)
BEGIN_LOOP
REQUEST FIELDS((#OV_DIRECT *L3 *P2 *NOID) (#OV_FILTER *L4 *P2) (#OV_PB01 *L6 *P2 *NOID *OBJECTS *IOCOND) (#OV_PB02 *L8 *P2 *NOID *OBJECTS *IOCOND) (#OV_PB03 *L6 *P38 *NOID *OBJECTS *IOCOND)
               (#OV_PB04 *L8 *P38 *NOID *OBJECTS *IOCOND) (#OV_BYTES *L4 *P22 *OUT) (#OV_OBJECT *L4 *P49 *OUT)) BROWSELIST(#DLIST)
CASE OF_FIELD(#IO$KEY)
WHEN VALUE_IS('= B1')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_NAME)
EXECUTE SUBROUTINE(WTOD)
WHEN VALUE_IS('= B2')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_SUFFIX #OV_PREFIX)
EXECUTE SUBROUTINE(WTOD)
WHEN VALUE_IS('= B3')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_DATE #OV_TIME)
EXECUTE SUBROUTINE(WTOD)
WHEN VALUE_IS('= B4')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_SIZE)
EXECUTE SUBROUTINE(WTOD)
OTHERWISE
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(GET_DIR #OV_DIRECT #OV_FILTER) TO_GET(#OV_RETC #OV_ERRN #WLIST)
IF COND('#OV_RETC =  OK')
EXECUTE SUBROUTINE(WTOD)
ELSE
MESSAGE MSGTXT('ERROR: Unable to list specified directory ')
ENDIF
ENDCASE
END_LOOP
**********
SUBROUTINE NAME(WTOD)
CLR_LIST NAMED(#DLIST)
CHANGE FIELD(#OV_BYTES) TO(0)
SELECTLIST NAMED(#WLIST)
CHANGE FIELD(#OV_BYTES) TO('#ov_bytes + #ov_size')
ADD_ENTRY TO_LIST(#DLIST) WITH_MODE(*DISPLAY)
ENDSELECT
ENDROUTINE

以下のRDMLファンクションの例は、ディレクトリ名を指定するよう要求し、指定されたディレクトリの内容を取得して表示します。結果として表示される内容は、さまざまな順序でソートできます。表示されたファイル名は、ダブルクリックして削除できます。ファイルの削除要求は、メッセージ・ボックスで[はい]をクリックして確定する必要があります。この例は、CS/400の自由形式のエディターにコピーして貼り付けることができますが、長いREQUESTコマンドを「展開」しないと、ファンクションが有効なRDMLコードとして受け入れられない場合があります。 

     FUNCTION OPTIONS(*DIRECT)
DEFINE FIELD(#OV_DIRECT) TYPE(*CHAR) LENGTH(70)
DEFINE FIELD(#OV_PIRECT) REFFLD(#OV_DIRECT)
DEFINE FIELD(#OV_FILTER) TYPE(*CHAR) LENGTH(3) LABEL('Optional Filter')
DEFINE FIELD(#OV_BYTES) TYPE(*DEC) LENGTH(9) DECIMALS(0) LABEL('Total of Sizes') EDIT_CODE(3)
DEFINE FIELD(#OV_OBJECT) TYPE(*DEC) LENGTH(7) DECIMALS(0) LABEL('Total Objects') EDIT_CODE(3)
DEFINE FIELD(#OV_SELECT) TYPE(*DEC) LENGTH(7) DECIMALS(0)
DEF_COND NAME(*OBJECTS) COND('#ov_object *gt 0')
DEFINE FIELD(#OV_RETC) TYPE(*CHAR) LENGTH(2)
DEFINE FIELD(#OV_ERRN) TYPE(*DEC) LENGTH(15) DECIMALS(0)
DEFINE FIELD(#OV_NAME) TYPE(*CHAR) LENGTH(15)
DEFINE FIELD(#OV_PREFIX) TYPE(*CHAR) LENGTH(12)
DEFINE FIELD(#OV_SUFFIX) TYPE(*CHAR) LENGTH(3)
DEFINE FIELD(#OV_DATE) TYPE(*CHAR) LENGTH(8)
DEFINE FIELD(#OV_TIME) TYPE(*CHAR) LENGTH(6)
DEFINE FIELD(#OV_ISDIR) TYPE(*CHAR) LENGTH(1)
DEFINE FIELD(#OV_SIZE) TYPE(*DEC) LENGTH(9) DECIMALS(0) EDIT_CODE(3)
DEFINE FIELD(#OV_PB01) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB01) DEFAULT('''Order By Name''')
DEFINE FIELD(#OV_PB02) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB02) DEFAULT('''Order By Suffix''')
DEFINE FIELD(#OV_PB03) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB03) DEFAULT('''Order By Date/Time''')
DEFINE FIELD(#OV_PB04) TYPE(*CHAR) LENGTH(30) INPUT_ATR(PB04) DEFAULT('''Order By Size''')
DEF_LIST NAME(#WLIST) FIELDS(#OV_NAME #OV_PREFIX #OV_SUFFIX #OV_DATE #OV_TIME #OV_SIZE #OV_ISDIR) TYPE(*WORKING) ENTRYS(5000)
DEF_LIST NAME(#DLIST) FIELDS(#OV_NAME #OV_PREFIX #OV_SUFFIX #OV_DATE #OV_TIME #OV_SIZE #OV_ISDIR) COUNTER(#OV_OBJECT) SEL_ENTRY(#OV_SELECT)
**********
BEGIN_LOOP
CHANGE FIELD(#OV_PIRECT) TO(#OV_DIRECT)
REQUEST FIELDS((#OV_DIRECT *L3 *P2 *NOID) (#OV_FILTER *L4 *P2) (#OV_PB01 *L6 *P2 *NOID *OBJECTS *IOCOND) (#OV_PB02 *L8 *P2 *NOID *OBJECTS *IOCOND) (#OV_PB03 *L6 *P38 *NOID *OBJECTS *IOCOND)
               (#OV_PB04 *L8 *P38 *NOID *OBJECTS *IOCOND) (#OV_BYTES *L4 *P22 *OUT) (#OV_OBJECT *L4 *P49 *OUT)) BROWSELIST(#DLIST)
CASE OF_FIELD(#IO$KEY)
WHEN VALUE_IS('= B1')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_NAME)
EXECUTE SUBROUTINE(WTOD)
WHEN VALUE_IS('= B2')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_SUFFIX #OV_PREFIX)
EXECUTE SUBROUTINE(WTOD)
WHEN VALUE_IS('= B3')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_DATE #OV_TIME)
EXECUTE SUBROUTINE(WTOD)
WHEN VALUE_IS('= B4')
SORT_LIST NAMED(#WLIST) BY_FIELDS(#OV_SIZE)
EXECUTE SUBROUTINE(WTOD)
OTHERWISE
IF COND('(#ov_pirect = #ov_direct) *and (#ov_select *gt 0) *and (#ov_object *gt 0)')
EXECUTE SUBROUTINE(DELETE_FIL)
ELSE
EXECUTE SUBROUTINE(LOAD_DIR)
ENDIF
ENDCASE
END_LOOP
**********
SUBROUTINE NAME(LOAD_DIR)
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(GET_DIR #OV_DIRECT #OV_FILTER) TO_GET(#OV_RETC #OV_ERRN #WLIST)
IF COND('#OV_RETC =  OK')
EXECUTE SUBROUTINE(WTOD)
ELSE
MESSAGE MSGTXT('ERROR: Unable to list specified directory ')
ENDIF
ENDROUTINE
**********
SUBROUTINE NAME(DELETE_FIL)
DEFINE FIELD(#OV_MBA) TYPE(*CHAR) LENGTH(1)
DEFINE FIELD(#OV_MSG) TYPE(*CHAR) LENGTH(100)
GET_ENTRY NUMBER(#OV_SELECT) FROM_LIST(#DLIST)
IF COND('#ov_isdir = Y')
MESSAGE MSGTXT('Selected object is a directory and cannot be deleted')
ELSE
USE BUILTIN(BCONCAT) WITH_ARGS('Confirm that file' #OV_NAME 'is to deleted') TO_GET(#OV_MSG)
USE BUILTIN(OV_MESSAGE_BOX) WITH_ARGS(#OV_MSG 'Delete File' YN Q) TO_GET(#OV_MBA)
IF COND('#OV_MBA = Y')
USE BUILTIN(TCONCAT) WITH_ARGS(#OV_DIRECT '\' #OV_NAME) TO_GET(#OV_MSG)
USE BUILTIN(OV_FILE_SERVICE) WITH_ARGS(REMOVE_FILE #OV_MSG) TO_GET(#OV_RETC)
IF COND('#OV_RETC =  OK')
EXECUTE SUBROUTINE(LOAD_DIR)
MESSAGE MSGTXT('File successfully deleted')
ELSE
MESSAGE MSGTXT('ERROR : Attempt to delete file failed')
ENDIF
ENDIF
ENDIF
ENDROUTINE
**********
SUBROUTINE NAME(WTOD)
CLR_LIST NAMED(#DLIST)
CHANGE FIELD(#OV_BYTES) TO(0)
SELECTLIST NAMED(#WLIST)
CHANGE FIELD(#OV_BYTES) TO('#ov_bytes + #ov_size')
ADD_ENTRY TO_LIST(#DLIST) WITH_MODE(*DISPLAY)
ENDSELECT
ENDROUTINE