Es gibt noch den FuBa 'EPS_GET_DIRECTORY_LISTING'. Wobei der Probleme mit Wildcards hat und man bestimmte Berechtigungen braucht, die seit SOX bei uns nicht mehr vergeben werden.airwaver hat geschrieben:Hat jemand eine Idee?
Code: Alles auswählen.
FUNCTION z_get_dir_list_only_files .
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(DIRECTORY) TYPE EPSF-EPSDIRNAM OPTIONAL
*" VALUE(FILE) TYPE EPSF-EPSFILNAM OPTIONAL
*" EXPORTING
*" VALUE(FILE_COUNTER) TYPE EPSF-EPSFILSIZ
*" TABLES
*" DIR_LIST STRUCTURE EPSFILI OPTIONAL
*" EXCEPTIONS
*" INVALID_DIRECTORY_FILE
*" EMPTY_DIRECTORY_LIST
*" READ_ERROR
*"----------------------------------------------------------------------
* Initialize variables
CLEAR: v_opsys, w_file.
* Default the ROOT Directory based on the Operating System
IF directory IS INITIAL.
v_opsys = sy-opsys.
TRANSLATE v_opsys TO UPPER CASE.
CASE v_opsys.
WHEN 'WINDOWS NT'.
directory = 'C:'.
WHEN OTHERS.
directory = '/'.
ENDCASE.
ENDIF.
* File must have a value.
IF file IS INITIAL.
file = '*'.
ENDIF.
* Read all Directories and Files from Application Server
CALL 'C_DIR_READ_FINISH'
ID 'ERRNO' FIELD w_file-errno
ID 'ERRMSG' FIELD w_file-errmsg.
CALL 'C_DIR_READ_START'
ID 'DIR' FIELD directory
ID 'FILE' FIELD '*'
ID 'ERRNO' FIELD w_file-errno
ID 'ERRMSG' FIELD w_file-errmsg.
IF sy-subrc <> 0.
RAISE invalid_directory_file.
ENDIF.
DO .
CLEAR w_file.
CALL 'C_DIR_READ_NEXT'
ID 'TYPE' FIELD w_file-type
ID 'NAME' FIELD w_file-name
ID 'LEN' FIELD w_file-len
ID 'OWNER' FIELD w_file-owner
ID 'MTIME' FIELD w_file-mtime
ID 'MODE' FIELD w_file-file_mode
ID 'ERRNO' FIELD w_file-errno
ID 'ERRMSG' FIELD w_file-errmsg.
IF sy-subrc = 1.
EXIT.
ELSEIF sy-subrc = 5.
IF w_file-type IS INITIAL.
w_file-type = '???'.
ELSEIF w_file-owner IS INITIAL.
w_file-owner = '???'.
ELSEIF w_file-file_mode IS INITIAL.
w_file-file_mode = '???'.
ENDIF.
ELSE.
RAISE read_error.
ENDIF.
* Only Files
IF w_file-type(1) EQ 'F' OR w_file-type(1) EQ 'f'.
* Only matching pattern
CHECK w_file-name CP file.
w_epsfili-name = w_file-name.
w_epsfili-size = w_file-len.
APPEND w_epsfili TO dir_list.
ENDIF.
ENDDO.
* How many Files did we found?
file_counter = LINES( dir_list ).
* No Files -> Exception
IF file_counter EQ 0.
RAISE EMPTY_DIRECTORY_LIST.
ENDIF.
ENDFUNCTION.
Erst einmal muss ich mich für die unvollständige Codevorlage entschuldigen.airwaver hat geschrieben:Wir sind auf Release 4.6c. Kann es daran liegen?
Hat noch jemand eine andere Idee?
Code: Alles auswählen.
* Für 6.4
TYPES: BEGIN OF zdirectory,
name(100),
type(20),
len(16),
owner(20),
mtime(6),
file_mode(9),
errno(3),
errmsg(40),
mod_date(10),
mod_time(8),
END OF zdirectory.
DATA: v_opsys TYPE sy-opsys,
v_data TYPE string,
v_date TYPE sy-datum,
w_file TYPE zdirectory,
w_epsfili TYPE epsfili.
* Für 4.6c
TYPES: BEGIN OF zdirectory,
name(260) TYPE c, " name of entry. (possibly truncated.)
type(10) TYPE c, " type of entry.
len(8) TYPE p, " length in bytes.
owner(8) TYPE c, " owner of the entry.
mtime(6) TYPE p, " last modification date, seconds since 1970
file_mode(9) TYPE c, " like "rwx-r-x--x": protection mode.
useable(1) TYPE c,
subrc(4) TYPE c,
errno(3) TYPE c,
errmsg(40) TYPE c,
mod_date TYPE d,
mod_time(8) TYPE c, " hh:mm:ss
END OF zdirectory.
DATA: v_opsys TYPE sy-opsys,
v_data TYPE string,
v_date TYPE sy-datum,
w_file TYPE zdirectory,
w_epsfili TYPE epsfili.
Code: Alles auswählen.
CALL 'C_DIR_READ_NEXT'
ID 'TYPE' FIELD w_file-type
ID 'NAME' FIELD w_file-name
ID 'LEN' FIELD w_file-len
ID 'OWNER' FIELD w_file-owner
ID 'MTIME' FIELD w_file-mtime
ID 'MODE' FIELD w_file-file_mode
ID 'ERRNO' FIELD w_file-errno
ID 'ERRMSG' FIELD w_file-errmsg.
IF sy-subrc = 1.
EXIT.
ELSEIF sy-subrc = 5.
IF w_file-type IS INITIAL.
w_file-type = '???'.
ELSEIF w_file-owner IS INITIAL.
w_file-owner = '???'.
ELSEIF w_file-file_mode IS INITIAL.
w_file-file_mode = '???'.
ENDIF.
*** Hier muss die Null ausgeschlossen werden
ELSEIF sy-subrc <> 0.
RAISE read_error.
ENDIF.
Code: Alles auswählen.
CALL 'C_DIR_READ_START'
ID 'DIR' FIELD directory
ID 'FILE' FIELD '*'
ID 'ERRNO' FIELD w_file-errno
ID 'ERRMSG' FIELD w_file-errmsg.
IF sy-subrc <> 0.
RAISE invalid_directory_file.
ENDIF.
DO .
CLEAR w_file.
CALL 'C_DIR_READ_NEXT'
ID 'TYPE' FIELD w_file-type
Feldnamen 1 - 4
directory SV50070\TEST\A16NT
w_file-errno 20
w_file-errmsg opendir: Not a directory
SY-SUBRC 1 SY-TABIX 1
Das ist so kein Problem, da mit diesem Aufruf die Aufrufkette initialisiert wird. Bei sy-subrc war sie schon initialisiert.airwaver hat geschrieben: C_DIR_READ_FINISH wird schon mit RC 3 beendet.
Die Vormatierung ist schlecht zu lesen, wenn ich das richtig sehe versuchst du auf das Verzeichnis 'SV50070\TEST\A16NT' zu zu greifen. Das ist def. kein "valides" Verzeichnis. Für Unix fehlt das führende '\'. Du kannst mit der AL11 auch Browsen um die Ergebnisse zu prüfen. Von wo testes du? UNIX ist bei Verzeichnissen Case-Sensitive, darauf Achten.airwaver hat geschrieben: Und dann kommt eben.....Es will also nicht so richtig funktionieren....Code: Alles auswählen.
CALL 'C_DIR_READ_START' ID 'DIR' FIELD directory ID 'FILE' FIELD '*' ID 'ERRNO' FIELD w_file-errno ID 'ERRMSG' FIELD w_file-errmsg. IF sy-subrc <> 0. RAISE invalid_directory_file. ENDIF. DO . CLEAR w_file. CALL 'C_DIR_READ_NEXT' ID 'TYPE' FIELD w_file-type Feldnamen 1 - 4 directory SV50070\TEST\A16NT w_file-errno 20 w_file-errmsg opendir: Not a directory SY-SUBRC 1 SY-TABIX 1