Gambas-it

Gambas3 => Programmazione => Topic aperto da: vigiot - 02 Novembre 2017, 23:26:07

Titolo: [Risolto] Access forbiten file in scrittura
Inserito da: vigiot - 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 ...
Titolo: Re:Access forbiten file in scrittura
Inserito da: milio - 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...
Titolo: Re:Access forbiten file in scrittura
Inserito da: vigiot - 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:
Titolo: Re:Access forbiten file in scrittura
Inserito da: Arco - 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.
Titolo: Re:Access forbiten file in scrittura
Inserito da: Gianluigi - 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 (http://www.gambas-it.org/wiki/index.php?title=Percorso_assoluto_e_percorso_relativo_dei_file)

 :ciao:
Titolo: Re:Access forbiten file in scrittura
Inserito da: vigiot - 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:
 
Titolo: Re:Access forbiten file in scrittura
Inserito da: Gianluigi - 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:
Titolo: Re:Access forbiten file in scrittura
Inserito da: vigiot - 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:
Titolo: Re:Access forbiten file in scrittura
Inserito da: milio - 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"
Titolo: Re:Access forbiten file in scrittura
Inserito da: vuott - 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)".   (http://www.ilvicolodellenews.com/wp-includes/images/smilies/thinking.gif)
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: vigiot - 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:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: vuott - 04 Novembre 2017, 01:59:36
Dal wiki:
Citazione
Usare la funzione write( ) con la funzione fopen( )

...già !
Me ne ero dimenticato.   ;D
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: Gianluigi - 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:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: vuott - 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 ".
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: Gianluigi - 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:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: vigiot - 04 Novembre 2017, 23:49:54
Forse mi sono perso qualcosa.
Tutte i file che vengono creati dal programma servono al programma stesso per funzionare.
Il progetto è ambizioso, lo ammetto, potrà servire a "partite iva" con la passione per Gnu-Linux.
Quanti programmi a pagamento che si occupano solo di emettere fatture conoscete ?
Tra l'altro girano solo su Wind e Mac chissà perché .... :P
Questa potrebbe essere la risposta ....( gratuita pure, ci pensa lo stato al resto )
Chissà ...
 8)
 :ciao: :ciao:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: Gianluigi - 05 Novembre 2017, 19:58:56

Tutte i file che vengono creati dal programma servono al programma stesso per funzionare.


Forse stiamo facendo due discorsi diversi, se i file vengono tutti creati all'apertura del progetto nessuno escluso, credo che tu li possa usare in lettura e scrittura sempre a patto che, se usi Gambas, tu ti riferisca al progetto come ti ha suggerito Milio.
Ma se non hai particolari esigenze di segretezza che comunque tanto segreta non è (vuott docet) ti eviti mal di testa e possibili malfunzionamenti creando i file in una cartella nascosta nella home dell'utente.
Se poi hai dei file da copiare allora sei obbligato nella scelta indicata.
Spero di essermi spiegato.

 :ciao:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: vigiot - 06 Novembre 2017, 22:11:48
Concordo.
Il consiglio di Milio (che ringrazio sinceramente) è perfetto oltre che giusto.
Una volta che avrò finito, posterò il codice, con una piccola richiesta:
Provatelo, giocateci un po ...  8) 8)
E' normale che chi scrive codice non veda tutti gli errori ...  :-[
e se tu o vuott voleste dargli una occhiata (senza alcun impegno ovviamente) ve ne sarei molto grato. :-*
Ho dato uno scorcio e ho visto che c'è la possibilità di creare un pacchetto .deb, mi devo documentare bene
perché non mi è tutto chiaro, specialmente per le dipendenze.
Ma ripeto devo documentarmi meglio.  :)

 :ciao: :ciao:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: Gianluigi - 07 Novembre 2017, 14:00:48
Sicuramente molti di noi proveranno il tuo programma e se riscontreranno qualcosa che non va te lo faranno sapere.

Per quanto riguarda la pacchettizzazione qualcosa si è discusso anche in questo forum, comunque non è cosa difficile la finestra wizard la semplifica, qui trovi una lezione (https://cursogambas.blogspot.it/2012/09/crear-un-paquete-de-instalacion-de.html) in spagnolo su questo argomento fatta da Jsbsan che è membro anche di questo forum.

 :ciao:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: vigiot - 07 Novembre 2017, 16:26:37
Grazie mille  :D :D
Copiata e salvata ... 8)
A proposito (abuso di pazienza tua...)
Hai idea di come si possa far apparire un balloon alle coord. XY alla chiusura di una determinata finestra?
Vorrei evitare l'uso di un messagebox, e pio così è più .....fico!

Grazie  :ciao: :ciao:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: Gianluigi - 07 Novembre 2017, 17:22:18
Occorre che tu apra una nuova discussione per poter favorire future ricerche, ti prego di esporre bene il problema con un titolo descrittivo.

 :ciao:
Titolo: Re:[Risolto] Access forbiten file in scrittura
Inserito da: vigiot - 07 Novembre 2017, 21:36:58
Grazie lo farò  ;)
Era una domanda della serie :"poche idee ma ben confuse"

A presto...
 :ciao: :ciao: