Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [PILLOLA] - L'aBc dei files

    L'ABC (Apertura, BGestione, e Chiusura dei files)

    Vista la continua richiesta di aiuto e l'importanza dell'argomento che, troppo spesso, non viene trattato come deve sui più diffusi manuali, ecco che mi accingo ad integrare la pillola di boomboom69 (leggi) che spiega come gestire un “database” su file. Questa pillola non vuole essere esaustiva sull'argomento “files”, anche perchè esistono decine e decine di funzioni a riguardo, ma vuole prendere in considerazione le occasioni in cui si utilizzano più comunemente i files (con le funzioni annesse).
    Attenzione: per tutta la pillola si darà per scontato l'argomento “permessi” che ricopre una parte di non poca importanza nella gestione dei files. Questo perchè i permessi vengono gestiti diversamente da un ambiente windows piuttosto che linux. Rimando alla documentazione ufficiale per chiarimenti riguardo ai permessi (vd. chmod).

    I file, questi sconosciuti
    Ogni giorno si utilizzano file, in Esplora risorse per gli utenti winzozz e in nautilus (o konqueror) per gli utenti linux, ecc... Ma finchè si tratta di gestirli per mezzo di un'interfaccia grafica tutto va bene. Cosa succede quando si deve “dialogare” con il server da uno script?
    Php e i suoi sviluppatori vi mettono a disposizione una serie di funzioni che permettono di gestire i files in modo facile e intuitivo.
    L'unica raccomandazione che faccio, per una questione di portabilità degli script è di stare bene attenti ai nomi dei file: lettere maiuscole e minuscole, su molti webserver (in particolare quelli linux-based) non sono la stessa cosa!!!

    Nuovo, “taglia”, copia&incolla: la gestione dei files, qualsiasi tipo essi siano
    -Nuovo (fopen()manuale)
    Ok, ho il mio foglio bianco e voglio far capire al webserver che voglio creare un file. Si, ma come?
    Per creare un file basta aprirlo. PHP controllerà l'esistenza del file e, se questo non esiste, cercherà di crearlo (con i dovuti parametri):
    Codice PHP:
    <?php
    $filename 
    “prova.txt”;
    $fp fopen($filename“w”);
    //fopen() ritorna un puntatore al file se tutto è andato a buon fine
    // (vd. dopo come utilizzarlo), FALSE in caso contrario
    ?>
    Questo breve script cerca di aprire un file in scrittura (la condizione di scrittura “w” è necessaria perchè questo venga creato), e se non esiste nella cartella specificata, lo crea.
    Quali sono i parametri con cui si può aprire un file (vengono elencati i più comuni)?
    “r” Apre il file in lettura
    “r+” Apre il file in lettura e scrittura (ma non cerca di crearlo se questo non esiste)
    “w” Apre il file in scrittura e cerca di crearlo se non esiste
    “w+” Come “r+” ma con la differenza che se il file non esiste cerca di crearlo
    “a” Apre il file in scrittura (e cerca di crearlo se non c'è) ponendo il puntatore alla fine del file (vd. sotto)
    “a+” Apre il file in scrittura elettura (e cerca di crearlo se non c'è) ponendo il puntatore alla fine del file (vd. sotto)

    La differenza tra “w” ed “a” è nella posizione del puntatore. Nella modalità “a” (append) quando si tenta di scrivere qualcosa, il testo (o il contenuto) che si vuole scrivere viene aggiunto alla fine del file. Se si esegue la medesima operazione con “w” il contenuto che si va a scrivere sovrascriverà quello eventualmente presente nel file.

    -Copia&Incolla (e “taglia”) (copy()manuale, unlink - manuale)
    Ebbene si, sto “saltando” la parte riguardante il comando “taglia” per un semplice motivo: eseguire questa operazione, spesso facilitata dall'intefaccia grafica, significa fare in sequenza COPIA -> INCOLLA -> CANCELLA (il vecchio file).

    Abbiamo creato un nuovo file. Come gestirlo?
    I comandi disponibili in php necessari per effettuare questa operazione si riducono a due: copy (copia) e unlink (cancella):
    Codice PHP:
    <?php
    // Riprendo le variabili dello script di cui sopra

    // Copia del file
    copy($filename“nuovofile.txt”);
    // Ora ho due file: prova.txt e nuovofile.txt
    // Supponiamo che prova.txt non mi serva più e lo voglia cancellare
    unlink($filename);
    ?>
    Bene, in due comandi ho fatto un copia&incolla, un taglia e una cancellazione. Facile no? Nulla da invidiare alla GUI!

    -Controlli sui file (file_exists()manuale, is_file()manuale)
    Cosa succede se cerco di copiare un file che non esiste? O se cerco di copiare qualcosa che non è un file?? PHP, giustamente, ritorna un warning. Si può limitarci a sopprimere questa avvertenza con una “@”, ma sarebbe da struzzi e poco professionale. E soprattutto, il giorno che qualcosa non va il cliente ci fa un (__)(__) così...
    Vediamo due funzioni che permettono di ovviare a questo “inconveniente” in maniera semplice ed efficace (e senza troppe righe di codice): is_file() e file_exists().
    Codice PHP:
    <?php
    if(is_file($filename)) echo “Si“ $filename “ è effettivamente un file!;
    else  echo 
    “No“ $filename “non è un file”;

    if(
    file_exists($filename)) echo “Siil file esistese vuoi puoi effettuare operazioni con questo file”;
    else  echo 
    “No il file non esisteCrealo prima con fopen();
    ?>
    Come avrete notato dalla struttura dell'if, queste due funzioni ritornano entrambe TRUE o FALSE, quindi sono semplicissime da gestire e lasciano poco spazio ad eccezioni.

    -Rinominare (rename()manuale)
    Lo script si commenta da sè:
    Codice PHP:
    <?php
    // rinomina $filename in “prova2.txt”.
    rename($filename“prova2.txt”);
    ?>
    -Un caso “a sè”: i file in upload (move_uploaded_file()manuale, is_uploaded_file()manuale)
    Una piccola parte “a sè” vogliono i file di cui si è appena effettuato l'upload. Per “spostare” e controllare questi files vengono citate (senza spiegazioni in quanto il loro utilizzo è il medesimo delle loro “gemelle” già esposte) due funzioni: is_uploaded_file() e move_uploaded_file().

    -Conculsioni
    Questesono alcune delle funzioni per manipolare i files. Per tornare alla storia dei permessi controllate sul manuale anche le funzioni is_writable()/is_writeable() (sono la stessa cosa) e chmod(), per citarne alcune...



    Tanto fumo, niente arrosto. Che ce ne facciamo di files vuoti??
    Abbiamo visto come creare, spostare, rinominare, eliminare i files. Ma come scrivere all'interno dei file? Come leggere il loro contenuto?

    -Apri, scrivi e chiudi (fopen()manuale, fwrite()manuale, fclose()manuale)
    Vediamo ora come scrivere qualcosa in un file. Per semplicità e per la sua larga diffusione useremo un file di testo.
    [PHP]<?php
    // Supponiamo di ricominciare lo script da capo, dimenticando le variabili dichiarate in precedenza
    $filename = “divinacommedia.txt”;
    if(!($fp=fopen($filename, “w”))) die(“Impossibile aprire/creare il file. Lo script viene interrotto.”);

    // La stringa da scrivere nel file
    $testo = “Nel mezzo del cammin di nostra vita\nMi ritrovai per una selva oscura\n”;
    $testo .= “Che la diritta via era smarrita.”;

    //Passiamo a scrivere il file
    $esito = fwrite($fp, $testo);
    if($esito == FALSE) echo “errore di scrittura sul file”;
    else echo “il file è stato scritto correttamente, ora hai il primo verso della divina commedia!”;

    //chiudiamo il file
    fclose($fp);
    ?>[PHP]

    Penso ci sia ben poco da commentare. Con fopen() apro un file in scrittura, con fwrite() ci scrivo dentro il contenuto della variabile $testo e con con fclose() chiudo il file. Troppo spesso il processo di chiusura viene dimenticato. Certo non fa bene lasciare un puntatore ad un file campato per aria, quindi ricordatevi sempre di chiudere i vostri files!

    -Leggere il contenuto di un file (per righe) (file()manuale)
    Se i più esperti si stanno chiedendo perchè ho deciso di utilizzare la funzione file() al posto di fread() o altre simili (che consiglio comunque di visionare) i motivi sono principalmente due: la funzione file() recupera tutte le righe di un file e le salva in un array, in modo che si possano facilmente recuperare e gestire, e perchè mi sembra la più comoda e veloce da spiegare in una pillola di questo livello.
    Come appena detto possiamo recuperare tutte le righe del file utilizzando un'unica funzione, senza nemmeno bisogno di aprire e chiudere il file.
    Il numero di ogni posizione dell'array che verrà generato indicherà la riga corrispondente nel file.
    Codice PHP:
    <?php
    //riprendo le variabili dallo script appena sopra

    // Leggo il contenuto della divina commedia
    $divina file($filename);

    //Stampo la seconda riga (gli array partono a contare da 0, se vi state chiedendo il perchè dell'1)
    echo $divina[1];

    //Stampo tutto il contenuto del file
    for($i 0$i <= sizeof($divina); $i++)
        echo 
    $divina[$i];

    // N.B. Si possono recuperare, oltre che files, anche contenuti di indirizzi web
    $html_it file([url]http://www.html.it”[/url]); // questo ritorna il codice HTML
    ?>
    -Per i pigri (file_put_contents()manuale, file_get_contents()manuale)
    Si ma io non ho voglia di aprire, scrivere/leggere chiudere il file tutte le volte. Nei miei script apro il file una volta sola e tutte le volte devo infilarci diecimila funzioni? No, tranquilli, per i pigri ci sono due funzioni che fanno questo lavoro al posto vostro!
    file_put_contents() apre, scrive e chiude il file in una botta sola;
    file_get_contents() apre, legge e chiude il file in una botta sola (il contenuto viene salvato in una stringa).
    Codice PHP:
    <?php
    $file 
    “unaltrofile.txt”;
    $byte file_put_contents($file“Ciao io sono un testo di prova”);
    echo 
    “Sono stati scritti “ $byte “ byte di dati.;

    echo 
    file_get_contents($file); // Stamperà “Ciao io sono un testo di prova”);
    ?>
    Conclusioni
    La gestione dei file, per come è stata esposta, sembra semplice e banale. Saper usare bene le funzioni giuste al punto giusto, scegliere che metodi usare, conoscere altre funzioni, ecc può risultare utile e far risparmiare parecchio tempo e risorse. Spero che qualcuno trovi utile questa pillola che a molti sembrerà banale (ai più, forse, e ai più esperti), ma che vuole essere una specie di “introduzione” ai file.

    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  2. #2
    eheh bene ho fatto una cosa inutile...
    beh pace era fatta a tempo perso...
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  3. #3
    Utilissimo!Ora lo leggo e ti so dire visto che sto imparando php da poco

  4. #4
    bene, spero possa esserti d'aiuto!! Anche perchè sei il mio "motivo di soddisfazione" visto che evidentemente ho trattato un argomento non abbastanza tecnico da attirare l'attenzione di altri

    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  5. #5
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    Bello.
    Una mia piccola nota:

    Io uso il costrutto:

    Codice PHP:
    if ($fp = @fopen($filename“w”)) ... 
    In quanto il semplice if non sopprime la stampa dell'errore a video (php.ini permettendo), quindi per l'utente bello comunque non è

    [.:: JaguarXF ::.]
    __________________

  6. #6
    giusto non ci avevo pensato! =)

    grazie per l' "appendice"
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  7. #7
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    Originariamente inviato da iraiscoming223
    bene, spero possa esserti d'aiuto!! Anche perchè sei il mio "motivo di soddisfazione" visto che evidentemente ho trattato un argomento non abbastanza tecnico da attirare l'attenzione di altri

    non credere, non è una pillola di quelle ultra/blasonate/tecniche ma potrà essere d'aiuto a molti che incominciano. anche se è un argomento ben trattato sia sui manuali sia su internet, averlo sul forum è sempre una risorsa in più.

    complimenti
    Errare humanum est, perseverare ovest

  8. #8
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    654
    Bè, eccoti un nuovo "affezionato" lettore
    Di file in php non sapevo una mazza e ho pensato bene di ingollarmi la tua pillola... adesso almeno so come muovermi...
    Ben fatto


    PS: c'è un punto della tua guida che è dentro il tag [php]... Potresti sistemarlo, perchè rende un po' difficoltosa la lettura

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.