Gestione file

From SageDev KB
Jump to navigation Jump to search


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).