Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: ivosperi - 06 Febbraio 2009, 17:09:50

Titolo: Gestione dei file di testo
Inserito da: ivosperi - 06 Febbraio 2009, 17:09:50
Ciao a tutti, ho ancora bisogno di consigli, sto cercando di salvare una matrice in un file di testo cercando sulle guide e con quello che ricordo sono riuscito a scrivere questo:

PUBLIC anag1 AS String[300]

PUBLIC SUB Salva()
  DIM i AS Integer
  DIM af AS File
   af = OPEN "ff" FOR OUTPUT
    FOR i = 1 TO 300
      PRINT #af, anag1
    NEXT
   CLOSE #af
END

Ma quando eseguo mi appare un errore: access forbidden sulla riga "open"
Qualche consiglio? grazie ciao
Titolo: Re: Gestione dei file di testo
Inserito da: fsurfing - 06 Febbraio 2009, 17:19:11
io per salvare una matrice faccio:

PUBLIC SUB Salva()
DIM i AS Integer
DIM stringa AS string


 FOR i = 1 TO 300

   stringa=stringa & anag1 & "\n"

 NEXT
file.save("percorso e nome file",stringa)

END

in questo modo io mi trovo meglio

per caricare la matrice dal file invece:


PUBLIC SUB carica()
DIM i AS Integer
DIM stringa AS string


 DIM stringa AS String


  stringa = File.Load("percorso e nome file")
  anag1 = Split(stringa, "\n", "", TRUE)

END
Titolo: Re: Gestione dei file di testo
Inserito da: madnessmike - 06 Febbraio 2009, 17:58:26
Curiosità:
Ma il comando File.Save salva sovrascrivendo il precedente file, o c'è possibilità di accodarlo senza bisogno di fare ad esempio:

Codice: [Seleziona]

stringa=File.load("nomefile")
stringa &= RobaDaAccodare
File.Save("nomefile", stringa)
Titolo: Re: Gestione dei file di testo
Inserito da: leo72 - 06 Febbraio 2009, 19:23:13
Durante la dichiarazione di OPEN se metti APPEND aggiunge dati in fondo al file, se metti CREATE cancella il file se esiste prima di scriverci:
Codice: [Seleziona]

OPEN file FOR OUTPUT [CREATE|APPEND]
Titolo: Re: Gestione dei file di testo
Inserito da: md9327 - 06 Febbraio 2009, 22:03:40
I metodi: File.Load() e File.Save() sono metodi generici, fatti per eseguire la lettura e la scrittura in un'unica soluzione, senza passare dal via... :-)
Molto utili per operazioni veloci, e dove non è necessario un controllo più particolareggiato.

Le operazioni più complesse, ovvero l'inserimento di testo (o binario), in un file esistente, deve essere fatto usando comandi più a basso livello, come OPEN, READ e WRITE. Le opzioni che è possibile aggiungere a questi comandi, sono fatte apposta per determinare il comportamento delle operazioni sul file.
Titolo: Re: Gestione dei file di testo
Inserito da: ivosperi - 07 Febbraio 2009, 11:30:58
Visto che il salvataggio sarà più complesso di come sto provando, preferirei utilizzare il metodo "tradizionale"

Premetto che il file "ff" non esiste e avevo già provato ad aggiungere "CREATE"
ma l'errore rimane uguale.

ciao ivo
Titolo: Re: Gestione dei file di testo
Inserito da: md9327 - 07 Febbraio 2009, 12:35:10
Prova ad indicare esattamente la path del file di destinazione; è probabile che il tentativo di scrittura avvenga nella root del sistema, o in qualche directory non accessibile in scrittura.
E' necessario fare attenzione a questa cosa, e avere l'accortezza di verificare prima dove l'applicazione stà puntando al momento; la classe Application ha dei metodi per verificare questo.
Titolo: Re: Gestione dei file di testo
Inserito da: - 07 Febbraio 2009, 17:37:22
Io di solito faccio così
PUBLIC anag1 AS String[300]
PUBLIC SUB Salva()
DIM i AS Integer
DIM af AS File
OPEN "/percorso/file.txt" FOR READ WRITE CREATE as #af
FOR i = 1 TO 300
dato = anag & gb.newline 'ti serve andare a capo ? omettilo se non serve
WRITE #af , dato , len(dato)  ' si fà così ,da guida, se no dà file troncato quando lo apri
NEXT
CLOSE #af
END
Titolo: Re: Gestione dei file di testo
Inserito da: Ceskho - 07 Febbraio 2009, 17:44:08
usa i tag (code) sennò i messaggi letti così sembrano liste della spesa.
Titolo: Re: Gestione dei file di testo
Inserito da: - 07 Febbraio 2009, 18:54:33
intendi con il codice tutto bello colorato come in gambas ? Non so come fare ,,,,,
Titolo: Re: Gestione dei file di testo
Inserito da: leo72 - 07 Febbraio 2009, 23:37:21
Per inserire del codice, inseriscilo fra i tag
Codice: [Seleziona]
 e 
.
Titolo: Re: Gestione dei file di testo
Inserito da: Ceskho - 08 Febbraio 2009, 00:18:14
Citazione

giac_fab ha scritto:
intendi con il codice tutto bello colorato come in gambas ? Non so come fare ,,,,,


O fai come dice Leo o più semplicemente evidenzi il codice e poi clicchi sul tasto in alto...il terzo dopo il tastino per scegliere le emoticons (faccine) da inserire nelle tue risposte ai post...( Quello così: <>)
Titolo: Re: Gestione dei file di testo
Inserito da: ivosperi - 09 Febbraio 2009, 11:16:31
OK scrivendo per esteso il percorso funziona, Grazie mille Ivo
Titolo: Re: Gestione dei file di testo
Inserito da: El Berto - 05 Gennaio 2012, 15:36:47
Ciao, allora, io provo a fare in questo modo:
Codice: [Seleziona]
file.Save(user.home & "/lastcheck.txt", "<dt><font color=" "#FFFFFF" ">" & Time(Now) & " (last check)</dt>") 
file.Save(MntFolder & "/lastcheck.txt", "<dt><font color=" "#FFFFFF" ">" & Time(Now) & " (last check)</dt>")

Nel primo caso salvo il file sull'hard disk, e funziona.
Nel secondo caso, io ho montato una directory su un disco in rete, ma mi dice "access forbidden".
Suppongo ci sia qualche problema con autorizzazioni e permessi, giusto?
Titolo: Re: Gestione dei file di testo
Inserito da: fsurfing - 06 Gennaio 2012, 14:16:07
esatto , non hai i permessi per scrivere in quella posizione
Titolo: Re: Gestione dei file di testo
Inserito da: El Berto - 03 Gennaio 2013, 17:59:40
Mi secca non riuscire a fare una cosa tanto semplice....

Voglio salvare un file nella cartella locale:

Codice: [Seleziona]
File.save("pippo.txt","ciao")

E mi mette "Access forbidden"

Se invece utilizzo il path completo:

Codice: [Seleziona]
File.save("/home/Michele/.../pippo.txt","ciao")
funziona.
Perchè?
Titolo: Re: Gestione dei file di testo
Inserito da: fsurfing - 03 Gennaio 2013, 18:12:06
dipende da che permessi ha la cartella locale ,
comunque è consigliabile sempre far in modo che il programam salva i dati all' esterno della cartella locale , solitamente si crea una cartella con il nome del programma nella home , tale cartella può essere visibile o nascosta a tua scelta e la raggiungi con:

Codice: [Seleziona]
File.save(user.home & "/nome_cartella/nome_file.txt","ciao")

per creare la cartella:

Codice: [Seleziona]
if not exist(user.home & "/nome_cartella") then
  mkdir user.home & "/nome_cartella"
END IF

questo discorso perchè una volta che crei l' eseguibile e lo pacchettizzi , questo verrà posto in /usr/bin  e quindi il programma stesso non potra scriverci , inoltre un utente linux si aspetta che vari file relativi ad un programma si trovino in  /home/nome_utente/nome_programma oppure in /home/nome_utente/.nome_programma


i file presenti nella cartella locale del progetto DEVONO sempre essere utilizzati solo per operazioni di lettura
Titolo: Re: Gestione dei file di testo
Inserito da: vuott - 04 Gennaio 2013, 13:49:11
dipende da che permessi ha la cartella locale ,
Non sembrerebbe...  :-\


Vorrei svolgere una riflessione sulla domanda posta da El Berto.

Quando si pone nel codice di un progetto il semplice nome (con eventuale estensione) di un file, significa che si punta alla cartella "Dati" del progetto medesimo, ossia insomma alla cartella medesima del progetto.
Ho notato che il tentativo di effettuare delle azioni su quel file può avere due diversi effetti e risultati, a seconda se viene specificato espressamente, o meno, l'intero percorso del file.

Poniamo il seguente esempio: tenteremo di svolgere delle azioni con un file chiamato "prova". Al fianco di ciascuna riga di comando riporto il risultato:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

   File.Save("prova", "questa è una prova")   ' Impossibile salvare il file: "Access forbidden" (come nell'esempio di "El Berto")

' Però (ovviamente commentando la riga precedente)......
   File.Save(Application.Path &/ "prova", "questa è una prova")   ' Possibile salvare il file

End

Da questo primo esperimento vediamo che l'accesso al file è possibile, ma solo se viene specificato espressamente il percorso.

Se andiamo a vedere i permessi del file, salvato (con la seconda modalità ovviamente) nella cartella "Dati" del progetto, avremo questa sorpresa analoga al risultato precedente:
Codice: gambas [Seleziona]

Public Sub Button2_Click()

   Print Stat("prova").Auth   ' Il file risulta essere solo leggibile: in console infatti avremo: r--------

' Però....
   Print Stat(Application.Path &/ "prova").Auth   ' il file risulta sia leggibile che scrivibile: in console infatti avremo: rw-rw-r--

End

      :rolleyes:


Ugualmente, se operiamo con le seguenti funzioni di Gambas:
Codice: gambas [Seleziona]

Public Sub Button3_Click()

   Copy "prova" To User.Home &/ "prova"   ' Possibile copiare il file

   Move "prova" To User.Home &/ "prova"   ' Impossibile spostare il file

' Però (ovviamente commentando la riga precedente)......
   Move Application.Path &/ "prova"   ' Possibile spostare il file

End


Come anche con la funzione Kill di Gambas:
Codice: gambas [Seleziona]

Public Sub Button4_Click()

   Kill "prova"     ' Impossibile eliminare il file: "Access forbidden"

' Però (ovviamente commentando la riga precedente)......
   Kill Application.Path &/ "prova"   ' Possibile eliminare il file

End


Insomma, lo stesso file individuato nel suo percorso in due maniere differenti, restituisce un duplice comportamento e risultato differente  :-\ da parte di Gambas.


...Riprendo, dunque, e ripongo la domanda di El Berto, integrandola sulla base di quanto sopra esposto......
Titolo: Re: Gestione dei file di testo
Inserito da: vuott - 06 Gennaio 2013, 01:01:11
Nel frattempo ho inserito la questione, sopra esposta, nella Mailing LIst Internazionale. Ho avuto una prima risposta da un utente che riporto integralmente (le righe in marroncino sono le sue; quelle in viola e più piccole sono mie):

« The answer lies in understanding the difference between relative and
absolute paths in the gambas runtime
.  There is some help at
http://gambasdoc.org/help/cat/path?pt&v3

Some comments inline below:

>    Copy "myFile" To User.Home &/ "myFile"
>
> it's possible copy the file;

Here you are using a relative path to a file inside the executable, not
the file in your source directory. So, as per the pemissions revealed by
your Print Stat(..) below, you can Copy it somewhere else.


> But if the code is:
>
>    Move "myFile" To User.Home &/ "myFile"
>
> it isn't possible to move the file.
> Infact an error returns: "Access forbidden".

Yes because the permissions for the file inside the executable are read
only and Move, i.e. Copy + Delete cannot be achieved.


> But, with "Move" if that code is:
>
>    Move Application.Path &/ "myFile" to User.Home &/ "myFile"
>
> it' s OK. No errors.

Here you are using an absolute path, i.e. your source directory, and as
per the second Stat below you do have Write access to that real file.

> ''''''
>
> So if the code is:
>
>    Print Stat("myFile").Auth
>
> the permissions are:  r--------
>
> but if the code is:
>
>    Print Stat(Application.Path &/ "myFile").Auth
>
> the console shows these permissions: rw-rw-r--
>
> ''''''
>
> And more.
>
>    File.Save("myFile", "this is my file")
>
> it isn't possible to save the file: "Access forbidden".

Again, the relative path means that you are trying to access the file
that has been compressed inside the executable and no write access is
allowed.


> BUT:
>
>    string = File.Load("myFile")
>
> this is possible !!!

As per the first example.


> And:
>  
>    File.Save(Application.Path &/ "myFile", "this is my file")
>
> this is possible.

Again, the absolute path means this is trying to save the real file
inside your source project.

Hope that helps

regards
Bruce
»