Obținerea listelor de fișiere și directoare de la servere FTP

Clientul FTP trebuie să obțină lista fișierelor și directoarelor din directorul curent al serverului. Aceasta ar trebui să conțină cât mai multe informații: dată, dimensiune, utilizator, grup, drepturi etc. Elementele apar în panou, unde puteți lucra cu ele. Lista provine din textul simplu primit de la server, destinat citirii de către oameni, nu analizei automate. Aproape fiecare server are propriul format, în funcție de sistemul de operare, limbă etc., deci clientul trebuie să gestioneze multe formate.

Pentru fiecare format este definit un tip de server. Include o condiție de detectare automată, lista coloanelor disponibile și vizibilitatea lor și un analizor al textului simplu. Toate tipurile sunt afișate în Configurare/Server-e. Puteți adăuga tipuri noi sau edita existente în dialogul de editare a tipului de server.

Puteți alege detectarea automată sau specifica tipul de server folosit. Vedeți opțiunea Tip server din dialogul Optiuni Avansate.

Obținerea listelor cu un tip de server specificat

Tipul specificat analizează lista de text simplu. La succes, rezultatul este lista fișierelor și directoarelor. Altfel, pluginul avertizează și afișează numai textul simplu, inutilizabil pentru operații.

Directorul „.”, dacă apare, și „..”, dacă apare în lista rădăcinii, sunt eliminate din listă. Directorul „..”, dacă este prezent, rămâne întotdeauna vizibil, ignorând atributul ascuns.

Obținerea listelor cu tip de server detectat automat

Sunt încercate pe rând toate tipurile. Pentru fiecare se evaluează condiția de detectare. Dacă este falsă, tipul este omis și se încearcă următorul. Dacă este adevărată, tipul analizează lista. La succes, rezultă lista fișierelor și directoarelor; altfel se trece la următorul tip.

Dacă niciun tip nu a analizat cu succes lista, sunt încercate pe rând tipurile omise din cauza condiției. Fiecare încearcă analiza textului. La succes rezultă lista; altfel se trece la următorul.

Dacă toate tipurile eșuează, pluginul avertizează și afișează numai textul simplu în panou, inutilizabil pentru orice operație.

Tipul este detectat automat numai pentru prima listă a serverului. Același tip este folosit ulterior, pentru aceleași coloane inclusiv la liste goale. Dacă nu mai poate analiza o listă, pluginul încearcă să detecteze alt tip.

Directorul „.”, dacă apare, și „..”, dacă apare în lista rădăcinii, sunt eliminate din listă. Directorul „..”, dacă este prezent, rămâne întotdeauna vizibil, ignorând atributul ascuns.

Sintaxa analizorului

Un comentariu de rând începe cu „#” și se termină la sfârșitul rândului.

Fiecare regulă începe cu „*” și se termină cu „;”. Numărul regulilor este nelimitat. Regula conține funcții separate prin „,”.

Funcția conține un nume, „(”, lista parametrilor și „)”. Lista completă a funcțiilor apare mai jos.

Parametrii sunt separați prin „,” și sunt expresii.

Expresia este un identificator de coloană, o variabilă de stare, o constantă sau o singură operație binară. Aceasta are forma standard (first_operand operation_symbol second_operand). Operandul poate fi identificator de coloană, variabilă de stare sau constantă.

Identificatorul de coloană conține caracterul '<', numele identificatorului și caracterul '>'.

Listele complete ale variabilelor de stare și simbolurilor operațiilor sunt mai jos.

Constanta este un șir, un număr sau o valoare booleană.

Șirul este încadrat în ghilimele duble (caracterele '"') și trebuie definit pe un singur rând. Secvențele escape încep cu caracterul '\'. Secvențele acceptate sunt: "\\" pentru caracterul '\', "\"" pentru caracterul '"', "\t" pentru tabulator, "\r" și "\n" pentru caracterele de sfârșit de rând (CR și LF). Alte secvențe escape sunt raportate ca erori de sintaxă.

Numărul conține cifre zecimale. Un număr negativ este precedat de „-”, iar unul pozitiv de „+”, care poate fi omis.

Valoarea booleană este „true” sau „false”, scrisă fără ghilimele.

Coloane

Fiecare coloană are un identificator, tipul valorilor, valoare goală, nume și descriere pentru panou și aliniere. Identificatorul este folosit la atribuirea valorilor. Fiecare coloană poate conține o singură valoare pentru fiecare fișier sau director. Fără atribuire se folosește valoarea goală definită. Coloanele pot fi vizibile sau ascunse; numai cele de tip Nume și Extensie sunt mereu vizibile. Se definesc în dialogul de adăugare/editare a coloanei.

Există următoarele tipuri de coloane:

TipDescriere
Numeșir; numele fișierului sau directorului; este necesară exact o coloană de acest tip; nu poate fi ascunsă; valoarea goală nu are sens; analizorul trebuie să atribuie o valoare fiecărui fișier și director; fără atribuire, regula nu adaugă niciun element, permițând omiterea rândurilor goale sau neimportante; atribuirea șirului gol ("") este eroare de analiză
Extensieșir; extensia fișierului; valorile sunt generate automat din coloana Nume; nu poate fi ascunsă; valoarea goală nu are sens
Marimea Fisierului in Bytesîntreg fără semn pe 64 de biți; dimensiunea în octeți; pentru directoare este zero și apare ca „DIR” în panou; valoarea goală implicită este zero
Data Ultimei Scrieridată; data ultimei scrieri sau modificări; trebuie să fie validă, altfel se înlocuiește cu 1 ianuarie 1602; valoarea goală implicită este 1 ianuarie 1602
Ora Ultimei Scrierioră; ora ultimei scrieri sau modificări; valoarea goală implicită este 0:00:00
Tip Fisierșir; descrierea tipului, definită de Windows pentru extensii; valorile sunt generate automat din coloana Nume; valoarea goală nu are sens
Orice Textșir; scop general; valoarea goală implicită este șirul gol ("")
Orice Datadată; scop general; trebuie să fie validă, altfel se înlocuiește cu 1 ianuarie 1602; valoarea goală implicită este șirul gol (""), adică nu se afișează nimic fără atribuire
Orice Oraoră; scop general; valoarea goală implicită este șirul gol (""), adică nu se afișează nimic fără atribuire
Orice Numarîntreg cu semn pe 64 de biți; scop general; valoarea goală implicită este șirul gol (""), adică nu se afișează nimic fără atribuire

Există și trei coloane virtuale cu identificatorii <is_dir>, <is_hidden> și <is_link>, cu valori booleene. Înseamnă „elementul este director?”, fals indicând un fișier, „elementul este ascuns?”, fals indicând lipsa atributului, și „elementul este legătură?”, fals indicând că nu este. Nu trebuie atribuite valori; valorile goale sunt „este fișier”, „nu este ascuns” și „nu este legătură”.

Sintaxa condiției de detectare automată

Condiția de detectare este o expresie logică. Operatorii, în ordine descrescătoare a priorității, sunt NOT, AND și OR. NOT, negație logică, este unar; AND, conjuncție, și OR, disjuncție, sunt binari. Expresia poate include subexpresii în paranteze. Următoarele funcții sunt folosite ca operanzi:

FuncțieDescriere
syst_contains(string)returnează true numai dacă răspunsul comenzii FTP SYST, care obține tipul sistemului serverului, conține șirul specificat, fără diferențierea majusculelor
welcome_contains(string)returnează true numai dacă primul mesaj al serverului conține șirul specificat, fără diferențierea majusculelor
reg_exp_in_syst(regular_expression_string)returnează true numai dacă răspunsul comenzii FTP SYST conține o potrivire a expresiei regulate specificate, fără diferențierea majusculelor
reg_exp_in_welcome(regular_expression_string)returnează true numai dacă primul mesaj al serverului conține o potrivire a expresiei regulate specificate, fără diferențierea majusculelor

Analiză

Analiza reușește dacă lista text este parcursă complet folosind regulile definite.

Poziția curentă în listă este numită cursor. În timpul analizei se deplasează de la început la sfârșit.

Regula poate fi folosită numai dacă toate funcțiile se evaluează cu succes, coloanei Nume nu i se atribuie șirul gol, adică i se poate atribui un șir nevid sau nimic, iar cursorul ajunge la sfârșitul unui rând. După regulă, cursorul este mutat întotdeauna la începutul rândului următor.

Evaluarea unei funcții poate muta cursorul și atribui sau modifica valori în coloane.

Analizorul poate conține oricâte reguli. Sunt încercate în ordinea definirii, folosindu-se întotdeauna prima aplicabilă.

Lista poate fi incompletă dacă utilizatorul anulează transferul sau apare o eroare de rețea. Lista incompletă este tăiată pentru a conține numai rânduri complete.

Lista incompletă este gestionată la nivelul regulilor. În cazul simplu, regulile mută cursorul la sfârșitul listei, încheind analiza cu succes. Altfel, o funcție a regulii curente ar trebui să treacă la următorul rând, dar acesta lipsește. Analiza se încheie atunci cu succes, ca și cum rândurile parcurse de regula curentă nu s-ar afla în lista incompletă.

Dimensiuni de fișiere acceptate

Pluginul acceptă dimensiuni în octeți și blocuri. Atribuiți dimensiunea coloanei Marimea Fisierului in Bytes, dacă este în octeți, sau unei coloane Orice Numar cu numele standard „Blocks” ori „BlkSize”. Astfel, dimensiunea totală apare în octeți sau blocuri în linia de informații la selectarea unui grup de fișiere.

Funcții pentru analiză

Dacă nu se precizează altfel, funcția reușește întotdeauna, nu mută cursorul și nu atribuie valori coloanelor. Dacă îl mută, se presupune, în lipsa altei precizări, că nu poate depăși sfârșitul rândului spre cel următor.

Înaintea folosirii identificatorului coloanei într-o expresie trebuie atribuită o valoare coloanei. Altfel expresia nu are sens și poate fi înlocuită cu constanta booleană calculată folosind valoarea goală implicită.

Notă: În tabelul următor, spațiul alb este spațiu sau tabulator.

Există următoarele funcții de analiză:

FuncțieDescriere
if(expression)rezultatul expresiei, parametrul expression, trebuie să fie boolean; funcția reușește dacă rezultatul este true
assign(<column>, expression)tipul rezultatului expresiei, parametrul expression, trebuie să coincidă cu tipul coloanei, parametrul <column>; atribuie rezultatul coloanei
skip_white_spaces()omite toate spațiile albe de la cursor și îl mută după ele, dacă există
skip_to_number()mută cursorul la cea mai apropiată cifră zecimală
white_spaces()omite toate spațiile albe de la cursor; reușește numai dacă acesta se deplasează
white_spaces(number)omite un șir cu numărul specificat de spații albe, parametrul number, de la cursor; îl mută după șir; reușește numai dacă șirul există
white_spaces_and_line_ends()omite toate spațiile albe și sfârșiturile de rând de la cursor; reușește numai dacă acesta se deplasează și nu ajunge la sfârșitul listei, adică există un caracter după spațiile albe și sfârșiturile de rând
rest_of_line()mută cursorul la sfârșitul rândului; reușește numai dacă se deplasează
rest_of_line(<column>)coloana, parametrul <column>, trebuie să fie de tip șir; îi atribuie textul dintre cursor și sfârșitul rândului, exclusiv; mută cursorul la sfârșitul rândului; reușește numai dacă se deplasează
word()omite toate caracterele în afară de spații albe și sfârșituri de rând; reușește numai dacă se deplasează cursorul
word(<column>)coloana, parametrul <column>, trebuie să fie de tip șir; îi atribuie textul de la cursor până înaintea primului spațiu alb sau sfârșit de rând; mută cursorul după șir; reușește numai dacă se deplasează
number(<column>)coloana, parametrul <column>, trebuie să fie întreagă; îi atribuie numărul zecimal de la cursor; numărul trebuie urmat de un separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după număr; reușește numai dacă numărul există și este terminat corect, iar pentru Marimea Fisierului in Bytes trebuie să fie nenegativ
positive_number(<column>)coloana, parametrul <column>, trebuie să fie întreagă; îi atribuie numărul zecimal pozitiv de la cursor; dacă este negativ, atribuie valoarea goală implicită, zero pentru Marimea Fisierului in Bytes și șir gol pentru Orice Numar; trebuie să fie urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după număr; reușește numai dacă numărul există și este terminat corect
number_with_separators(<column>, string) coloana, parametrul <column>, trebuie să fie întreagă; îi atribuie numărul zecimal de la cursor cu separatori de grupare a cifrelor pentru lizibilitate; separatorii permiși sunt în parametrul string și pot fi orice caractere în afară de cifre zecimale, „+” și „-”; numărul trebuie urmat de un separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după număr; reușește numai dacă numărul există și este terminat corect, iar pentru Marimea Fisierului in Bytes trebuie să fie nenegativ
month_3(<column>)coloana, parametrul <column>, trebuie să fie dată; îi atribuie luna reprezentată prin trei litere de la cursor; acceptă nume în engleză, germană, norvegiană și suedeză; numele trebuie urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după nume; reușește numai dacă luna este cunoscută și toate lunile listei sunt în aceeași limbă
month_3(<column>, string)coloana, parametrul <column>, trebuie să fie dată; îi atribuie luna de trei litere de la cursor folosind numele din parametrul string, care conține douăsprezece nume separate prin spații, de exemplu „jan feb mar apr may jun jul aug sep oct nov dec” în engleză; numele trebuie urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după nume; reușește numai dacă luna este în șir
month_txt(<column>)coloana, parametrul <column>, trebuie să fie dată; îi atribuie luna reprezentată prin numele de la cursor; în prezent acceptă germana; numele trebuie urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după nume; reușește numai dacă numele este cunoscut și toate lunile listei sunt în aceeași limbă
month_txt(<column>, string)coloana, parametrul <column>, trebuie să fie dată; îi atribuie luna al cărei nume începe la cursor, din parametrul string cu douăsprezece nume separate prin spații, de exemplu „Jan. Feb. März Apr. Mai Juni Juli Aug. Sept. Okt. Nov. Dez.” în germană; numele trebuie urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după nume; reușește numai dacă numele apare în șir
month(<column>)coloana, parametrul <column>, trebuie să fie dată; îi atribuie luna ca număr zecimal de la cursor, urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după număr; reușește numai pentru valori între 1 și 12
day(<column>)coloana, parametrul <column>, trebuie să fie dată; îi atribuie ziua ca număr zecimal de la cursor, urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după număr; reușește numai pentru valori între 1 și 31
year(<column>)coloana, parametrul <column>, trebuie să fie dată; îi atribuie anul ca număr zecimal de la cursor, urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după număr; reușește pentru intervalul 0–999, adăugând 2000 la 0–79 și 1900 la 80–999, astfel încât 107 înseamnă 2007, sau pentru intervalul 1602–9999
time(<column>)coloana, parametrul <column>, trebuie să fie oră; atribuie ore, minute și opțional secunde și milisecunde zecimale de la cursor; formate acceptate: 00:00, 00:00:00 sau 00:00:00.000; sufixele „a”, „am”, „p” sau „pm” indică dimineața ori seara și corectează ora; urmează un separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu literă sau cifră; mută cursorul după oră; reușește numai pentru o oră validă, cu intervalele 0-23, 0-59, 0-59 și 0-999
year_or_time(<column_date>, <column_time>) coloanele, parametrii <column_date> și <column_time>, trebuie să fie dată și oră; atribuie anul și opțional ora, numai ore și minute, reprezentate de un număr pentru an sau două numere separate prin „:” pentru oră la cursor; acceptă formatul Unix standard: dacă este an, ora este necunoscută, iar dacă este oră, anul se calculează din data curentă astfel încât data completă să nu fie mai veche de șase luni; numerele trebuie urmate de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după valoare; reușește numai pentru an sau oră valide, în intervalele 1602-9999 și 0-23:0-59
all(number)omite numărul de caractere din parametrul number; mută cursorul după ele; reușește numai dacă au fost omise toate
all(<column>, number)coloana, parametrul <column>, trebuie să fie șir; îi atribuie șirul de la cursor cu numărul de caractere din parametrul number; mută cursorul după șir; reușește numai dacă șirul există
all_to(string)găsește prima apariție a șirului din parametrul string, fără diferențierea majusculelor, și mută cursorul după ea; reușește numai dacă șirul este găsit
all_to(<column>, string)coloana, parametrul <column>, trebuie să fie șir; îi atribuie textul de la cursor până după prima apariție a parametrului string, fără diferențierea majusculelor; mută cursorul după șirul găsit; reușește numai dacă este găsit
all_up_to(<column>, string)coloana, parametrul <column>, trebuie să fie șir; îi atribuie textul de la cursor până înaintea primei apariții a parametrului string, fără diferențierea majusculelor; mută cursorul după șirul găsit; reușește numai dacă este găsit
unix_link(<is_dir>, <column_name>, <column_link>)coloanele <column_name> și <column_link> trebuie să fie Nume și Orice Text; folosește șirul de la cursor până înaintea sfârșitului rândului și mută cursorul după el; așteaptă formatul Unix standard „link_name -> target_name” sau „link_name” când ținta este inaccesibilă; extrage numele și opțional ținta și detectează dacă legătura este spre fișier sau director: o extensie în nume sau țintă sugerează fișier, altfel director; dacă euristica nu corespunde, adăugați de exemplu „assign(<is_dir>,false)” după unix_link; atribuie numele coloanei <column_name>, ținta cunoscută coloanei <column_link> și true coloanei virtuale <is_dir> pentru directoare; reușește numai dacă șirul are formatul așteptat și nu începe cu spațiu alb
unix_device(<column>)coloana, parametrul <column>, trebuie să fie șir; atribuie șirul de la cursor care conține două numere zecimale separate prin virgulă și câteva spații, de exemplu „27, 26”; șirul trebuie urmat de separator uzual, precum virgulă, punct, punct și virgulă sau două puncte, spațiu alb ori sfârșit de rând, nu de literă; mută cursorul după șir; reușește numai dacă este găsit
add_string_to_column(<column>, expression) coloana, parametrul <column>, și rezultatul expresiei, parametrul expression, trebuie să fie șiruri; adaugă rezultatul expresiei coloanei
cut_white_spaces_end(<column>)coloana, parametrul <column>, trebuie să fie șir; elimină spațiile albe de la sfârșit și atribuie noul șir coloanei
cut_white_spaces_start(<column>)coloana, parametrul <column>, trebuie să fie șir; elimină spațiile albe de la început și atribuie noul șir coloanei
cut_white_spaces(<column>)coloana, parametrul <column>, trebuie să fie șir; elimină spațiile albe de la început și sfârșit și atribuie noul șir coloanei
back(number)mută cursorul înapoi cu numărul de caractere din parametrul number; reușește numai dacă deplasarea este posibilă, fără trecere la rândul anterior
cut_end_of_string(<column>, number)coloana, parametrul <column>, trebuie să fie șir; elimină de la sfârșit numărul de caractere din parametrul number și atribuie noul șir coloanei; reușește numai dacă valoarea originală avea cel puțin number caractere

Variabile de stare folosite la analiză

Există următoarele variabile de stare:

VariabilăDescriere
first_nonempty_lineboolean; este true numai pe primul rând negol, care nu conține exclusiv spații albe
last_nonempty_lineboolean; este true numai pe ultimul rând negol, care nu conține exclusiv spații albe; ignoră dacă lista este completă
next_charșir; conține caracterul de la cursor; la sfârșitul listei este gol
next_wordșir; începe la cursor și se termină înaintea primului spațiu alb sau sfârșit de rând
rest_of_lineșir; începe la cursor și se termină înaintea sfârșitului rândului

Operatori folosiți la analiză

Înaintea folosirii identificatorului coloanei într-o expresie trebuie atribuită o valoare coloanei. Altfel expresia nu are sens și poate fi înlocuită cu constanta booleană calculată folosind valoarea goală implicită.

Există următorii operatori:

OperatorDescriere
==egalitate; compararea șirurilor diferențiază majusculele
!=inegalitate; compararea șirurilor diferențiază majusculele
eqegalitatea șirurilor; numai pentru șiruri; fără diferențierea majusculelor
not_eqinegalitatea șirurilor; numai pentru șiruri; fără diferențierea majusculelor
incăutare de subșir; este true numai dacă subșirul din operandul stâng apare în șirul din dreapta; fără diferențierea majusculelor
not_ineste true numai dacă subșirul din operandul stâng nu apare în șirul din dreapta; fără diferențierea majusculelor
end_witheste true numai dacă șirul din operandul stâng se termină cu subșirul din dreapta; fără diferențierea majusculelor
not_end_witheste true numai dacă șirul din operandul stâng nu se termină cu subșirul din dreapta; fără diferențierea majusculelor

Vedeți și

Configurare/Server-e
Dialogul de editare a tipului de server
Dialogul de adăugare/editare a coloanei
Dialogul de testare a analizorului

From the Sally manual (GPL-2.0-or-later), © 1997-2023 Open Salamander Authors; © 2025-2026 Elias Bachaalany. Source: manual source (zip) · original page in the Sally repository