Dimensione dei file[edit]
Per sapere la dimensione di un file:
filinfo(YFILEI,7)
è anche un modo per sapere se il file esiste:
If filinfo(YFILEI,7)<0
Infbox "File non trovato"
End
Endif
Scrittura/Lettura[edit]
Codice di esempio per la lettura/scrittura di file:
Local Char YFILEI(250),YFILEO(250)
Local Clbfile YETI(4)
YFILEI = filpath("TMP\ETICHETTE",'Eti_Standard',"eti")
If filinfo(YFILEI,7)<0
Infbox "File di input non trovato"
End
Endif
YFILEO = filpath("TMP\ETICHETTE",'Etichetta', "txt")
adxirs = ''
# apro il file YFILEI in lettura
Openi YFILEI,0 Using [YIN]
# leggo il file e metto in YETI
Rdseq YETI Using [YIN]
# chiudo il file
Openi Using [YIN]
...
# apro il file in scrittura
Openo YFILEO,0 Using [YOUT]
#scrivo sul file
Wrseq YETI Using [YOUT]
# chiudo il file
Openo Using [YOUT]
Per leggere i dati caricandoli su un clob:
Local Char YFILEI(250), YFILEO(250)
Local Clbfile YETI(4)
YFILEI = filpath("TMP\ETICHETTE",'Eti_Standard',"eti")
YFILEO = filpath("TMP\ETICHETTE",'Eti_OUTPUT',"txt")
Openi YFILEI,0 Using [YIN] # apro il file YFILEI in lettura
Iomode adxirs '' Using [YIN] #dopo l'apertura del file, contiene il separatore di record usato da Rdseq e Wrseq. Per leggere tutto in un'unica volta impostare come vuota
Iomode adxifs '' Using [YIN] #dopo l'apertura del file, contiene il separatore di campo
Iomode adxium 50 Using [YIN] #dopo l'apertura del file, codifica ASCII, necessaria per clob
Rdseq YETI Using [YIN] # leggo il file e metto in YETI
Openi YFILEI Using [YIN] # chiudo il file
Openo YFILEO,0 Using [YOUT]
Wrseq YETI Using [YOUT]
Openo YFILEO Using [YOUT]
Cancellare[edit]
Call SYSTEME(adxmac(1),'ae_rm '+PATHFILE,"",STAT) From ORDSYS
(per maggiori info vedi SYSTEME From ORDSYS)
Call EFFACE(PATHFILE,"",STAT) From ORDSYS
in V7: RETURN_STATUS=delFile(Path)
Creare cartella[edit]
Call SYSTEME(adxmac(0),'ae_mkdir '+PATHFILE,"",STAT) From ORDSYS
Call SYSTEME(adxmac(0),'ae_mkdir'-'"'+PATHFILE+'"',"",STAT) From ORDSYS
Spostare[edit]
Questo comando è stato usato da server X3 a percorso di rete.
Call MOVE (FILE_SRC, CARTELLA_DEST, YSTAT) From ORDSYS
Copiare file esterni[edit]
Per copiare un file da client (scelto interattivamente dal'utente) in un file su server X3
Local Integer STAT
Local Char FICCLI(250)
Local Char FICSRV(250)
FICSRV= "c:\SAGE\SAGEX3V6\X3V6\Folders\"+nomap(0)+"\TMP\nomefile.txt"
FICCLI = GDIREXP+"\*.pdf" #GDIREXP contiene al cartella di default per utente da dove selezionare i file
Call COPSRV(FICCLI,FICSRV,STAT) From ORDSYS
COPCLI serve invece per la direzione opposta, da server X3 a client
Call COPCLI(FICSRV,FICCLI,STAT) From ORDSYS
Per copiare un file da una cartella ad un'altra entrambe in percorsi di rete utilizzare la chiamata COPIE
(attenzione al maiuscolo/minuscolo!) Se il file di destinazione esiste già viene sovrascritto.
Local Char SRC(250)
Local Char DES(250)
Local Integer STAT
DES="\\sagedev\sage\Dossier\SAGEDEV\TMP\DP\test.pdf"
SRC="\\srvdev\TMP\xxx\esempio.pdf"
Call COPIE(SRC,DES,STAT) From ORDSYS
Verifica presenza file e cartelle[edit]
Call EXISTE(PATH,EXIST) From ORDSYS
restituisce:
- 0 se non esiste
- 1 se è un file
- 2 se è una cartella
Local Integer EXIST
Call EXISTE(PATH,EXIST) From ORDSYS
If EXIST <> 1
Errbox "file non presente"
Endif
Il modo diretto è il seguente (maggiori info nell'help in linea di filinfo):
Local Integer RETDIR
RETDIR = filinfo(PATH,0)
If RETDIR<0 or int(mod(RETDIR/4096, 16)) <> 4
Errbox "directory non presente"
Endif
Più semplicemente se è un file si può fare così:
If filinfo(YFILEI,7)<0
Infbox "File di input non trovato"
Endif
Per verificare la presenza di un file in un client usare
call EXICLI(FICCLI,STAT) from ORDSYS
Recuperare la lista dei file presenti in una cartella (attenzione a maiuscolo/minuscolo: *.txt è diverso da *.TXT)
Local Char PATH(250)
Local Char LISTAFILE(100)(1..1000)
Local Integer NUMFILE
PATH ="\\SAGEDEV\car1\A*"
Call SYSTEME2(adxmac(0),"lsadx"-PATH,"",NUMFILE,LISTAFILE) From ORDSYS
NUMFILE = min(NUMFILE,dim(LISTAFILE)) #nel caso in file siano più di quelli contenuti nell'array
Elenco file di una cartella[edit]
Il comando da utilizzare è
Call SYSTEME2 (adxmac(0),”lsadx”-DIR,””,LENGTH,FILELIST) From ORDSYS
Questa chiamata recupera il risultato del comando eseguito. Se non serve recuperare il comando basta usare SYSTEME (senza l'ultimo parametro di output).
Parametri:
- DIR: Nome directory (non deve contenere spazi)
- LENGTH: numero di file presente nella directory.
- FILELIST: Lista dei nomi dei file presenti nella directory (non devono contenere spazi). Deve essere una matrice di Char
Local Char DIR(GDIMFIC), FILELIST(GDIMFIC)(1..100)
Local Integer LENG
DIR="C:\test"
Call SYSTEME2 (adxmac(0),"lsadx"-DIR,"",LENG,FILELIST) From ORDSYS
For I=3 To LENG #I=3 per saltare le due cartelle . e ..
InfBox FILELIST(I)
Next
Oppure, con caratteri jolly, per recuperare tutti i file ODA*
:
Local Integer NUMFILE
Local Char LISTAFILE(100)(1..1000)
Local Char PATH(100), FICBAS(100)
PATH = ...
FICBAS='"' + "ODA*" + '"'
Call SYSTEME2(adxmac(0),"lsadx"-PATH-FICBAS,"",NUMFILE,LISTAFILE) From ORDSYS
For I=1 To LENG
InfBox FILELIST(I)
Next
Il comando deve essere scritto così: lsadx \\srvint1\IntranetPDF\hlp "*.pdf"
In realtà è possibile lanciare qualsiasi comando dos, e recuperarne lo standard output:
Local Char DIR(GDIMFIC), FILELIST(GDIMFIC)(1..100)
Local Integer LENG
DIR="C:\temp"
Call SYSTEME2 (adxmac(0),"dir /b "-DIR,"",LENG,FILELIST) From ORDSYS
For I=3 To LENG #I=3 per saltare le due cartelle . e ..
InfBox FILELIST(I)
Next
Altro modo con forfiles
Char CMD(100)
CMD='forfiles /p'-MIO_PATH-'/m *.* /c "CMD /C ECHO @File"'
System FILES = adxmac(1)+'@cmd.exe /C '+CMD #System permette di eseguire un comando di sistema
#stat1 conterrà il numero di righe restituite dall'istruzione System
Local Char FILES(100)(stat1)
For YIND = 1 To stat1-1 #partire da 1 per evitare la prima riga sempre vuota
Infbox FILES(YIND)
Next
Estensione[edit]
Non ho trovato un modo nativo per recuperare l'estensione di un file; riporto qui un metofo banale :
Subprog GET_EXT(NOMEFILE, ESTENSIONE)
Value Char NOMEFILE()
Variable Char ESTENSIONE()
Local Integer I,PREC
I=0
Repeat
PREC=I
I = instr(I+1, NOMEFILE, ".")
Until I = 0
ESTENSIONE=""
If PREC
ESTENSIONE= tolower(right$(NOMEFILE,PREC+1))
Endif
End
Altri comandi[edit]
filpath(..)
filinfo(..)
dir$
Esempio: costruzione di un percorso qualsiasi
[L]PATH = filpath([L]DIR, [L]NOMEFILE, [L]ESTENSIONE, [L]DOSSIER, [L]VOLUME, [L]SERVER)
filpath("DIR","NOMEFILE","ESTENSIONE","SAGEDEV") # => "C:\SAGE\SAGEX3V6\X3V6\Folders\SAGEDEV\DIR\NOMEFILE.ESTENSIONE"
filpath("DIR","NOMEFILE","ESTENSIONE","SAGEDEV","A") # => "C:\SAGE\SAGEX3V6\X3V6\Folders\SAGEDEV\DIR\NOMEFILE.ESTENSIONE"
filpath("DIR","NOMEFILE","ESTENSIONE","SAGEDEV","A","srvx3") # => "srvx3@C:\SAGE\SAGEX3V6\X3V6\Folders\SAGEDEV\DIR\NOMEFILE.ESTENSIONE"
filpath(CARTELLA,nomefile,estensione) costruisce il path assoluto di un file:
se CARTELLA inizia per "\\" mantiene la cartella così come passata nel parametro
se CARTELLA inizia per "\" da un percordo del tipo "C:\CARTELLA"
se CARTELLA non inizia con la barra, da un percorso del tipo "C:\SAGE\SAGEX3\Folders\DOSSIER\CARTELLA\nomefile.estensione"
Tra le altre cose permettono un test dell'esistenza di una tabella; esempio
# Test dell'esistenza della tabella 'CLIENT' nell'applicazione corrente
If filinfo(filpath('FIL','CLIENT','fde',-1),1) <0 : Goto INEX : Endif
Caricamento[edit]
Carico di un file da client verso file su server
Local Integer STAT
Local Char FICCLI(250)
Local Char FICSRV(250)
FICSRV= "c:\SAGE\SAGEX3V6\X3V6\Folders\"+nomap(0)+"\TMP\YDOC_"+format$("D:YYYYMMDD[_]hhmmss",date$)+"_"+GUSER+".pdf"
FICCLI = GDIREXP+"\*.pdf"
Call COPSRV(FICCLI,FICSRV,STAT) From ORDSYS
Per modificare la dimensine massima dle file caricabile, modificare il file di configurazione nodelocal.js di Syracuse:
upload: {
fileMaxSize:
{ default: 20, //default max size in MB
patchUpdate: 500 //max size of patchFile in MB }
},
adxirs e adxifs[edit]
adxirs è una variabile stringa di massimo 2 caratteri che contiene il record separatore usato dalle istruzioni Rdseq e Wrseq per la lettura/scrittura sequenziale dei file. Ogni elemento in una lista data come argomento in Rdseq o Wrseq è separata da questo valore. Per leggere tutto il file in un'unica volta bisogna impostare come vuota questa variabile.
Alla fine del file invece, sia in scrittura che in lettura viene considerato il separatore di linea inidicato da adxifs. Va notato che è una variabile globale valida per tutti i file aperti.
Per avere un controllo per ogni singolo file aperto bisogna usare l'istruzione Iomode (consigliato).