Autore Topic: Stat con directory  (Letto 1961 volte)

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 283
    • Mostra profilo
Stat con directory
« il: 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)?

Online vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.871
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Stat con directory
« Risposta #1 il: 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. »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Stat con directory
« Risposta #2 il: 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.

nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Online vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.871
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Stat con directory
« Risposta #3 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 283
    • Mostra profilo
Re:Stat con directory
« Risposta #4 il: 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 :)
« Ultima modifica: 04 Gennaio 2025, 08:48:49 da pastrank »

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 283
    • Mostra profilo
Re:Stat con directory
« Risposta #5 il: 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).
« Ultima modifica: 04 Gennaio 2025, 09:08:12 da pastrank »

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 283
    • Mostra profilo
Re:Stat con directory
« Risposta #6 il: 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

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Stat con directory
« Risposta #7 il: 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  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 283
    • Mostra profilo
Re:Stat con directory
« Risposta #8 il: 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.
« Ultima modifica: 04 Gennaio 2025, 12:17:41 da pastrank »

Online vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.871
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Stat con directory
« Risposta #9 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 283
    • Mostra profilo
Re:Stat con directory
« Risposta #10 il: 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 :)

Online vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.871
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Stat con directory
« Risposta #11 il: 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 ?  ???
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 283
    • Mostra profilo
Re:Stat con directory
« Risposta #12 il: 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 :-)