Gambas-it

Gambas3 => Programmazione => Topic aperto da: pastrank - 03 Gennaio 2025, 23:01:12

Titolo: Stat con directory
Inserito da: pastrank - 03 Gennaio 2025, 23:01:12
Una cosa che non capisco: ho una directory, diciamo
/home/me/work/directory

che pero' e' un symlink alla directory
/home/me/hd1/work/directory

~/hd1 e' il punto di mount di un hard disk. Dunque, se io faccio readlink -n -f /home/me/work/directory, ottengo correttamente il nome della directory linkata. Ma non volevo shellare il processo, e volevo usare le funzioni interne. La funzione interna Stat("/home/me/work/directory").Link, pero', mi ritorna una stringa vuota, come se non fosse un symlink. Sbaglio qualcosa (ultimamente sono maestro degli sbagli)?
Titolo: Re:Stat con directory
Inserito da: vuott - 03 Gennaio 2025, 23:17:15
Una cosa che non capisco: ho una directory, diciamo
/home/me/work/directory

che pero' e' un symlink alla directory
/home/me/hd1/work/directory

~/hd1 e' il punto di mount di un hard disk. Dunque, se io faccio readlink -n -f /home/me/work/directory, ottengo correttamente il nome della directory linkata. Ma non volevo shellare il processo, e volevo usare le funzioni interne. La funzione interna Stat("/home/me/work/directory").Link, pero', mi ritorna una stringa vuota, come se non fosse un symlink. Sbaglio qualcosa (ultimamente sono maestro degli sbagli)?
Può darsi :-\ che il problema sorga dalla circostanza che fai riferimento a una "directory" e non a uno specifico "file", atteso che la guida dice riguardo alla Classe statica "Stat":
« Questa classe rappresenta tutte le informazioni restituite dal sistema su uno specifico file. »
Titolo: Re:Stat con directory
Inserito da: Gianluigi - 03 Gennaio 2025, 23:58:52

Può darsi :-\ che il problema sorga dalla circostanza che fai riferimento a una "directory" e non a uno specifico "file", atteso che la guida dice riguardo alla Classe statica "Stat":
« Questa classe rappresenta tutte le informazioni restituite dal sistema su uno specifico file. »

Credo che vuott abbia centrato il problema se creo un s-link nella cartella work e interrogo con
Codice: [Seleziona]
Print Stat("~/work/sdb").Type
la console mi ritorna 6 che è:
Citazione
Const Link As Integer = 6
Flag used by the Stat property for a symbolic link.

Titolo: Re:Stat con directory
Inserito da: vuott - 04 Gennaio 2025, 00:40:05
Pastrank, e se provi questo codice ?

Codice: [Seleziona]
Library "libc:6"

' ssize_t readlink (const char *path, char *buf, size_t len)
' Read the contents of the symbolic link PATH into no more than LEN bytes of BUF.
Private Extern readlink(path As String, buf As Byte[], _len As Long) As Long

' char *canonicalize_file_name (const char *path)
' Return the canonicalized absolute pathname of a symbolic links.
Private Extern canonicalize_file_name(path As String) As Pointer


Public Sub Main()

  Dim sl As String
  Dim buf As New Byte[32]
  Dim l As Long

  sl = "/home/me/hd1/work/directory"

  l = readlink(sl, buf, buf.Count)
 
  Print buf.ToString(0, l)
 

  Print String@(canonicalize_file_name(sl))

End
Titolo: Re:Stat con directory
Inserito da: pastrank - 04 Gennaio 2025, 08:40:55
la console mi ritorna 6 che è:
Citazione
Const Link As Integer = 6
Flag used by the Stat property for a symbolic link.

La mia speranza era che fosse una cosa che funzionasse come readlink, che sulla mia Debian non fa differenza e ritorna la posizione del file o della directory reale, e Python pure mi confonde le idee :)
Titolo: Re:Stat con directory
Inserito da: pastrank - 04 Gennaio 2025, 08:47:37
Pastrank, e se provi questo codice ?

Funziona :), e riesco a mantenere la funzione semplice e leggibile, mentre libc6 non e' una libreria esotica che magari a breve sparisce.
Codice: [Seleziona]
Public Function getSymlinkedDirectory(sl As String) As String
  Dim s As String
  Dim buf As New Byte[32]
  Dim l As Long

  l = readlink(sl, buf, buf.Count)
  s = String@(canonicalize_file_name(sl))
 
  Return IIf(s = "", sl, s) 
End
Mi succedendo di tutto  :rolleyes: questa funzione serve perche' l'applicazione che richiamo fa distinzioni tra il percorso originale e quello linkato, chissa' poi perche' (oltre a linee di comando e regole per l'importazione complicate, pero'  per le mie cose farebbe tutto e velocemente).
Titolo: Re:Stat con directory
Inserito da: pastrank - 04 Gennaio 2025, 09:14:54
Mi succedendo di tutto  :rolleyes:

Ma davvero: ho fatto un apt upgrade adesso, e sono cambiate cose nel programma che richiamo, per via di QT  :) :) :) Non sto a spiegare, ma e' roba che ci sto dietro da una settimana, con domande allo sviluppatore, cambi dei file di default dell'applicazione, etc etc
Titolo: Re:Stat con directory
Inserito da: Gianluigi - 04 Gennaio 2025, 10:30:03
la console mi ritorna 6 che è:
Citazione
Const Link As Integer = 6
Flag used by the Stat property for a symbolic link.

La mia speranza era che fosse una cosa che funzionasse come readlink, che sulla mia Debian non fa differenza e ritorna la posizione del file o della directory reale, e Python pure mi confonde le idee :)

ma se io scrivo questo:
Codice: [Seleziona]
 Print Stat("~/work/sdb", False).Link
qui funziona e mi ritorna il link.
Ma probabilmente a te serve qualcosa di diverso  :-\
Titolo: Re:Stat con directory
Inserito da: pastrank - 04 Gennaio 2025, 12:16:49
ma se io scrivo questo:
Codice: [Seleziona]
 Print Stat("~/work/sdb", False).Link
qui funziona e mi ritorna il link.

Ricapitolando:
directory: /home/me/tmp
linkata a: /home/me/hd1/tmp

Non mi funziona in nessun caso la risoluzione, neanche mettendo ~/tmp. Potrebbe essere il funzionamento sul mio sistema, la varieta' di questi porta a confusione. Giusto per curiosita': uso questa applicazione per leggere e scrivere dati perche' onnicomprensiva, altre molto piu' semplici non lo sono, e non vorrei usarne 2 o piu'. Pero' devo lanciare l'applicazione in un modo in cui questa usi uno script QML (passato con questa applicazione), e gia' la cosa mi piace poco. Per leggere i dati mi esporta un file csv fatto in un certo modo, e fin qui anche anche: ma definire il tipo del file con una scorciatoia mi fa paura, se lo sviluppatore cambia una virgola non torna piu' niente. Importare no. Per importarle creo un file csv in un certo formato, ma devo leggere il nome del link, se no non funziona. La procedura e' la stessa, stessi comandi, ordine etc etc, ma devo inserire il nome completo non symlinkato, per scoprirlo ho dovuto sudare :-)
Taglio qui per non farla lunga, ma come immaginerai, ogni cosa che tocco alla fine mi cambia in questo modo anche quelle precedenti molto spesso, e la cosa e' piuttosto noiosa.
Titolo: Re:Stat con directory
Inserito da: vuott - 04 Gennaio 2025, 15:38:17
Ma non volevo shellare il processo

Funziona :), e riesco a mantenere la funzione semplice e leggibile
Con l'uso esplicito di una delle due funzioni esterne hai dunque la possibilità di non usare l'istruzione Shell.
Titolo: Re:Stat con directory
Inserito da: pastrank - 04 Gennaio 2025, 16:44:09
Con l'uso esplicito di una delle due funzioni esterne hai dunque la possibilità di non usare l'istruzione Shell.

Si'. Comunque e' stato grazioso il fatto che, una volta che tutto funzionava, c'e' stato un aggiornamento dell'applicazione e ha rotto il tutto. Ora ho trovato la soluzione, pero' ufff :)
Titolo: Re:Stat con directory
Inserito da: vuott - 04 Gennaio 2025, 17:34:16
e ha rotto il tutto.
Scusami, non ho capito bene... aggiornando, neppure quelle funzioni esterne della libreria libc.so.6 hanno funzionato ?  ???
Titolo: Re:Stat con directory
Inserito da: pastrank - 04 Gennaio 2025, 17:47:58
Scusami, non ho capito bene... aggiornando, neppure quelle funzioni esterne della libreria libc.so.6 hanno funzionato ?  ???

Quelle che mi hai suggerito tu sono ok, tranquillo :-)