Autore Topic: Gestione dei file di testo  (Letto 2798 volte)

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 150
    • Mostra profilo
Re: Gestione dei file di testo
« Risposta #15 il: 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è?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Gestione dei file di testo
« Risposta #16 il: 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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gestione dei file di testo
« Risposta #17 il: 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......
« Ultima modifica: 05 Gennaio 2013, 15:57:31 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Gestione dei file di testo
« Risposta #18 il: 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
»
« Ultima modifica: 06 Gennaio 2013, 01:19:29 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. »