Autore Topic: [Risolto] Access forbiten file in scrittura  (Letto 1445 volte)

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
[Risolto] Access forbiten file in scrittura
« il: 02 Novembre 2017, 23:26:07 »
Salve, ho riscontrato il problema tentando di scrivere un file di testo:
Codice: [Seleziona]
  If (my_response) Then
    my_file = Open "./fatture_user/Utente.ftr" For Write
    For i = 0 To 4
      Write #my_file, dati_utente[i]
    Next
    my_file.Close
  Endif
Ho provato anche con For Create ma nulla  >:(
perché compare questo errore?
Alla voce dell'errore c'è un laconico "mancano i permessi contattare l'amministratore"
amministratore ?  ??? permessi ??  ??? ???
non sto variando un file di sistema !
Che istruzione devo dare per scrivere questo benedetto file? :-\

Grazie
 :ciao:

P.S. non mi ricordo più come si fa a mettere [risolto] nel precedente topic  :-[ :-[  scusate ...
« Ultima modifica: 04 Novembre 2017, 01:37:23 da vigiot »
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.263
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #1 il: 02 Novembre 2017, 23:57:48 »
In che cartella sta il file che vuoi aprire in scrittura?
Ti consiglio comunque di puntare ad una cartella nella user.home onde evitare appunto problemi di permessi...

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #2 il: 03 Novembre 2017, 02:48:09 »
Probabilmente ho fatto confusione, non ho un file da aprire.
il file non esiste, lo devo creare ex novo, scrivendoci i dati raccolti.
La dir in cui deve essere salvato il file è quella direttamente superiore.
"./ "
Mi spiego meglio
il progetto è situato nella cartella " x " in cui c'è la cartella " y " al cui interno devo salvare il file " z "
quindi l'istruzione dovrebbe essere:
my_file = Open "./y/z" for Write ( o Create).
Ma non funziona e non so il perché
 ???

Grazie  :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline Arco

  • Gambero
  • **
  • Post: 91
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #3 il: 03 Novembre 2017, 09:54:59 »
Penso che tu sappia che linux attribuisce i permessi di lettura, scrittura, esecuzione a ciascun file o cartella in relazione a ciascun utente.
Devi controllare che la cartella e sotto cartelle siano accessibili all'utente in uso.
« Ultima modifica: 03 Novembre 2017, 09:56:21 da Arco »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.136
  • Tonno verde
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #4 il: 03 Novembre 2017, 13:53:08 »

La dir in cui deve essere salvato il file è quella direttamente superiore.
"./ "


Mi sa che devi studiarti meglio i percorsi relativi, dai un occhio a questo

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

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #5 il: 03 Novembre 2017, 22:34:14 »
Citazione
Penso che tu sappia che linux attribuisce i permessi di lettura, scrittura, esecuzione a ciascun file o cartella in relazione a ciascun utente.
Devi controllare che la cartella e sotto cartelle siano accessibili all'utente in uso.

Avevo già provato (ma senza risultato) a modificare i permessi in modo che "tutti" avevao il permesso di leggere e scrivere. 8)

Citazione
Mi sa che devi studiarti meglio i percorsi relativi, dai un occhio a questo

ti porto ad esempio :
Codice: [Seleziona]
Public Sub load_prestazioni()
  Dim my_file As File
  Dim s$, er_t As String
 
  Try my_file = Open "./fatture_user/Tipo_Prestazioni.ftr" For Read
  If Error Then
    er_t = "Impossibile aprire il file Prestazioni causa:\n" & Error.Text
    Message.Error(er_t)
    Return
  Endif

  lista_prestaz = New String[]
  While Not Eof(my_file)
    Line Input #my_file, s$
    lista_prestaz.Add(s$)
  Wend
  num_prestaz = lista_prestaz.Count - 1
  my_file.Close
End
in questo caso il percorso "relativo"  funziona. 8)
In realtà credo che vi sia qualcosa da "settare" in Gambas per poter aver accesso in scrittura,
poiché se uso la libreria esterna "libc:6" riesco a creare senza patemi d'animo il file ... ;)
Non solo ma anche l'istruzione "Mkdir" nativa di gambas si rifiuta !  ???
Quindi mi si avvalora l'idea dei presunti "settagi" di prima.

Grazie  :ciao: :ciao:
 
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.136
  • Tonno verde
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #6 il: 03 Novembre 2017, 23:15:09 »
Credo proprio che tu non abbia letto attentamente quanto ti ho indicato prima.
Codice: [Seleziona]
my_file = Open "./fatture_user/Tipo_Prestazioni.ftr" For Read
Può funzionare solo nel caso che la cartella fatture_user sia presente all'interno del progetto e solo in lettura non in scrittura.

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

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #7 il: 04 Novembre 2017, 00:26:33 »
La cartella è presente, ed ha accesso a tutti sia in lettura che in scrittura.
So che tu non ami molto l'uso delle librerie esterne ma ..
Codice: [Seleziona]
Try my_file = Open "./fatture_user/Utente.ftr" For Write
  If Error Then
    er_t = "Impossibile aprire il file Prestazioni causa:\n" & Error.Text
    Message.Error(er_t)
  Else
    Write #my_file, my_utente.nome_completo
    my_file.Close
  Endif

questo non funziona mentre ..
Codice: [Seleziona]
pnt1 = fopen("./fatture_user/Utente.ftr", "w")
il file lo crea.
Ora devo capire bene quale funzione usare per scriverci dentro, ci sto lavorando.  :-\
Sto provando con
Codice: [Seleziona]
' ssize_t write (int __fd, const void *__buf, size_t __n)
' Write N bytes of BUF to FD.
Private Extern write_C(__fd As Integer, __buf As Pointer, __n As Long) As Long Exec "write"

my_str = my_utente.nome_completo
  pnt2 = VarPtr(my_str)
  write_C(Int@(pnt1 + 122), pnt2, 54)
ma non funge.  ??? ???

Grazie
 :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.263
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #8 il: 04 Novembre 2017, 00:35:37 »
Allora se tu vuoi fare riferimento alla cartella dove risiede il tuo programma prova cosi':
Application.Path &/ "fatture_user/Utente.frt"
« Ultima modifica: 04 Novembre 2017, 00:37:24 da milio »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.248
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Access forbiten file in scrittura
« Risposta #9 il: 04 Novembre 2017, 00:45:23 »
Codice: [Seleziona]
my_str = my_utente.nome_completo
  pnt2 = VarPtr(my_str)
  write_C(Int@(pnt1 + 122), pnt2, 54)
ma non funge.  ??? ???

Il valore del primo parametro formale della funzione esterna "write"  di C è un intero ottenuto solitamente dalla funzione esterna "open".
Non capisco quel "Int@(pnt1 + 122)".   
« Ultima modifica: 04 Novembre 2017, 01:03:16 da vuott »
« 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 vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:[Risolto] Access forbiten file in scrittura
« Risposta #10 il: 04 Novembre 2017, 01:45:24 »
Dal wiki:
Citazione
Usare la funzione write( ) con la funzione fopen( )
Comunque ho trovato la "quadra" con:
Codice: [Seleziona]
Public Sub btn_reqins_Click()
Dim pnt1, pw, pr As Pointer
Dim i As Byte
Dim er_t As String
Dim dati_utente As String[]
Dim my_str As String

  ' popoliamo i campi utente ...
  dati_utente = New String[]
  dati_utente.Add(campi_utn[0] & utn_tb1.Text & "\n", 0)
  dati_utente.Add(campi_utn[1] & utn_tb2.Text & "\n", 1)
  dati_utente.Add(campi_utn[2] & utn_tb8.Text & "\n", 2)
  dati_utente.Add(campi_utn[3] & utn_cb1.Text & " " & utn_tb3.Text & " " & utn_tb4.Text & " " & utn_tb5.Text & " " & utn_tb6.Text & " " & utn_tb7.Text & "\n", 3)
  dati_utente.Add(campi_utn[4] & utn_tb9.Text, 4)
  ' ora prepariamo il puntatore per il file da aprire in scrittura ...
  pnt1 = fopen("./fatture_user/Utente.ftr", "w")
  If pnt1 = Null Then
    er_t = "Impossibile aprire il file Prestazioni causa:\n" & Error.Text
    Message.Error(er_t)
  Else
    ' ... adesso i dati ...
    For i = 0 To 4
      'dati_utente[i]
      pw = Alloc(dati_utente[i])
      fwrite(pw, 1, Len(dati_utente[i]), pnt1)
    Next
  Endif
  my_response = True
  Free(pw)
  fclose(pnt1)
  requestwind.Close()
End
E funziona!  ;D ;D ;D
Grazie a tutti per il supporto, una menzione particolare a Gianluigi e a vuott per la pazienza e i codici.  :2birre: :2birre:
Quando tutto "l'ambaradan" funzionerà a dovere mi occuperò della pacchettizzazione i. .deb
Non temete vi "romperò i ..." ancora  ;D ;D ;D
 :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.248
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:[Risolto] Access forbiten file in scrittura
« Risposta #11 il: 04 Novembre 2017, 01:59:36 »
Dal wiki:
Citazione
Usare la funzione write( ) con la funzione fopen( )

...già !
Me ne ero dimenticato.   ;D
« 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.136
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Access forbiten file in scrittura
« Risposta #12 il: 04 Novembre 2017, 11:41:56 »
 :ciao: vigiot,

questo lo scrivo non tanto per te a cui interessa poco imparare il linguaggio Gambas ma per quei novizi che altrimenti interessati verrebbero fuorviati dai tuoi mostri sintattici.
Come ti è stato suggerito da altri oltre che da me, è profondamente sbagliato lasciare i file che devono interagire col nostro programma all'interno del programma Gambas.
Un utente Linux si attende di avere una cartella col nome del programma fra i file (normalmente nascosti) della propria home.
Quindi sarà nostra premura al primo avvio creare detta cartelle e copiarvi i file.
Questo anche perché se creeremo un eseguibile o dei pacchetti di installazione detti file saranno difficilmente praticabili, se non addirittura impraticabili.

In allegato un esempio in linguaggio Gambas3

P.S. Siccome "mostri sintattici" potrebbe apparire offensivo ci tengo a sottolineare che voleva essere scherzoso  :ciao:
« Ultima modifica: 04 Novembre 2017, 16:52:36 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.248
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:[Risolto] Access forbiten file in scrittura
« Risposta #13 il: 04 Novembre 2017, 14:54:00 »
...inoltre, se il file da crearsi sarà temporaneo, io sono solito preferire e utilizzare la cartella di sistema " tmp ".
« 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.136
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Access forbiten file in scrittura
« Risposta #14 il: 04 Novembre 2017, 15:16:15 »
...inoltre, se il file da crearsi sarà temporaneo, io sono solito preferire e utilizzare la cartella di sistema " tmp ".

Giusto, specialmente se si tratta di esempi come il mio sopra, in modo da evitare di sporcare la home con cartelle inutili.  :-[
A mia discolpa dico che in questo caso ho creduto bene di esemplificare efficacemente e in modo reale quanto durante la discussione era stato, diciamo così, ignorato  ;D

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