IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Classe de gestion de fichier


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut Classe de gestion de fichier
    Hello,

    Je vous propose la classe Fichier que je suis en train de développer. Je la remplis au fur et à mesure, lors de mes besoins dans mes développements, donc il se peut qu'il y manque des notions liées aux fichiers, donc vous pouvez l'améliorer à tout moment.

    Voici la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    /**
     * Classe de gestion de fichiers locaux et distants.
     */
    class Fichier
    {
     
    public $filename;
     
    public function __construct( $filename )
    {
      $this->filename = $filename;
    }
     
    /**
     * Renvoie le contenu du fichier s'il existe, un message d'erreur sinon.
     * @author  Josselin Willette
     * @param   string    $type     Type de contenu à retourner (string (valeur par défaut), array) (facultatif).
     * @param   string    $retour   Langage de retour dans le cas d'une erreur (facultatif).
     * @param   int       $offset   Position à laquelle on commence à lire (facultatif).
     * @param   int       $maxlen   Taille maximale d'octets (facultatif).
     * @return  mixed               Contenu sous la forme du type passé en paramètre.
     */
    public function get( $type = 'string', $retour = '', $offset = null, $maxlen = null )
    {
      try {
        $this->testURI();
     
        switch ( $type )
        {
          case 'array'  :
            if ( is_null( $maxlen ) ) {
              $contents = explode( "\n", file_get_contents( $this->filename, null, null, $offset ) );
            }
            else {
              $contents = explode( "\n", file_get_contents( $this->filename, null, null, $offset, $maxlen ) );
            }
          break;
     
          case 'string' :
          default       :
            if ( is_null( $maxlen ) ) {
              $contents = file_get_contents( $this->filename, null, null, $offset );
            }
            else {
              $contents = file_get_contents( $this->filename, null, null, $offset, $maxlen );
            }
          break;
        }
      }
      catch ( Exception $e ) {
        switch ( strtolower( $retour ) )
        {
          case 'css'    :
          case 'js'     :
            $contents = '/* ' . $e->getMessage() . ' */';
          break;
     
          case 'html'   :
          case 'xml'    :
            $contents = '<!-- ' . $e->getMessage() . ' -->';
          break;
     
          default       :
            $contents = $e->getMessage();
          break;
        }
      }
     
      return $contents;
    }
     
    /**
     * Ecrit le contenu passé en paramètre dans un fichier.
     * @author  Josselin Willette
     * @param   string    $content    Contenu à écrire.
     * @param   int       $append     Précise si on écrase le fichier ou si on écrit à la fin (0 par défaut : écrase) (facultatif).
     * @return  bool                  Retourne true en cas de succès et false en cas d'échec.
     */
    public function put( $content, $append = 0 )
    {
      $this->mkpath();
     
      try {
        if ( !file_put_contents( $this->filename, $content, $append ) )
        {
          $message = error_get_last();
          $message = $message['message'];
          throw new Exception( 'Impossible d\'écrire dans ' . $this->filename . "\n" . $message );
        }
     
        return true;
      }
      catch ( Exception $e ) {
        return false;
      }
    }
     
    /**
     * Crée une arborescence (vérifie son existence) en fonction du chemin du fichier (qui peut contenir son nom mais sera ignoré).
     * @author  Josselin Willette
     */
    public function mkpath()
    {
      $path_pieces = explode( '/', dirname( $this->filename ) );
     
      $path = '';
     
      while ( !is_null( $piece = array_shift( $path_pieces ) ) ) {
        $path .= $piece . '/';
     
        if ( !is_dir( $path ) ) {
          $this->createDirectory( 0777, $path );
        }
      }
    }
     
    /**
     * Teste si une URI est bonne et lance une exception dans le cas contraire.
     * @author  Josselin Willette
     */
    public function testURI()
    {
      if ( !@fopen( $this->filename, 'r' ) )
      {
        $message = error_get_last();
        $message = $message['message'];
        throw new Exception( 'Impossible d\'ouvrir ' . $this->filename . "\n" . $message );
      }
    }
     
    /**
     * Modifie les droits d'un fichier.
     * @author  Josselin Willette
     * @param   int     $mod     Nouveaux droits du fichier (en octal). Exemple : 0777
     */
    public function chProperties( $mod )
    {
      umask( 0 );
      chmod( $this->filename, $mod );
    }
     
    /**
     * Crée un répertoire à l'endroit spécifié.
     * @author  Josselin Willette
     * @param   int     $mod     Nouveaux droits du fichier (en octal). Exemple : 0777
     * @param   string  $path    Dossier à créer.
     */
    public function createDirectory( $mod, $path )
    {
      umask( 0 );
      mkdir( $path, $mod );
    }
     
    /**
     * Vérifie l'existence du fichier.
     * @author  Josselin Willette
     * @return  bool              Retourne true si le fichier existe, false le cas contraire.
     */
    public function exists()
    {
      clearstatcache();
      return file_exists( $this->filename );
    }
     
    /**
     * Supprime le fichier.
     * @author  Josselin Willette
     * @return  bool              Retourne true si le fichier a pu être supprimé, false sinon.
     */
    public function remove()
    {
      return unlink( $this->filename );
    }
     
    /**
     * Vérifie la validité d'un fichier en fonction d'une durée passée en paramètre.
     * @author  Josselin Willette
     * @param   int   $dureeValidite    Durée de validité du fichier, en secondes.
     * @return  bool                    Retourne true si le fichier est encore valide, false sinon.
     */
    public function valid( $dureeValidite )
    {
      clearstatcache();
      return time() - filemtime( $this->filename ) < $dureeValidite;
    }
     
    /**
     * Renvoie la taille du fichier.
     * @author  Josselin Willette
     * @return  int                    Retourne la taille du fichier.
     */
    public function size()
    {
      return filesize( $this->filename );
    }
     
    /**
     * Renomme le fichier.
     * @author  Josselin Willette
     * @param   string    $newName  Nouveau nom du fichier.
     * @param   bool      $change   Change le nom du fichier de l'objet courant.
     * @return  bool                Retourne true si le fichier a pu être renommé, false sinon.
     */
    public function rename( $newName, $change = false )
    {
      $o = rename( $this->filename, $newName );
     
      if ( $change == true ) {
        $this->filename = $newName;
      }
     
      return $o;
    }
     
    }
    La méthode mkpath() est encore améliorable ..

    N'hésitez pas à me faire des remarques d'améliorations de l'existant.



    Exemples d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $content = 'du texte';
     
    $fichier = new Fichier( '/home/sites/monsite/logs/cron-log.txt' );
     
    if ( !$fichier->exists() ) {
      $content = 'Début du fichier' . "\n" . $content;
    }
     
    $fichier->put( $content, FILE_APPEND ); // Si le fichier est inexistant, il est automatiquement créé ainsi que toute son arborescence
     
    echo $fichier->get();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $fichierCSS = new Fichier( 'http://www.monsite.com/fichier.css' );
     
    echo '<style type="text/css">' .
             $fichierCSS->get( 'string', 'css' ) .
         '</style>';
    Exemple de rotation de log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $content = 'plein de texte à logger';
     
    $fichier = new Fichier( '/home/cron/logs/cron-de-truc-muche.log' );
     
    if ( $fichier->exists() && $fichier->size() > 1000000 ) { // Rotation tous les ~1Mo
       $fichier->rename( $fichier->filename . date( 'YmdHis' ) );
    }
     
    // On écrit dans le fichier initialement chargé dans la classe, puisque l'on n'a pas utilisé le 2e paramètre de la méthode rename()
    $fichier->put( $content . "\n", FILE_APPEND );

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Une petite question au sujet des exceptions : pourquoi en lever une qui sera directement gérée ensuite comme dans cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public function put( $content, $append = 0 )
    {
      $this->mkpath();
     
      try {
        if ( !file_put_contents( $this->filename, $content, $append ) )
        {
          $message = error_get_last();
          $message = $message['message'];
          throw new Exception( 'Impossible d\'écrire dans ' . $this->filename . "\n" . $message );
        }
     
        return true;
      }
      catch ( Exception $e ) {
        return false;
      }
    }
    Cela revient à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public function put( $content, $append = 0 )
    {
      $this->mkpath();
     
      try {
        if ( !file_put_contents( $this->filename, $content, $append ) )
        {
          $message = error_get_last();
          $message = $message['message'];
          return false;
        }
     
        return true;
      }
      catch ( Exception $e ) {
        return false;
      }
    }
    Personnellement, je préfère un objet qui lève des exceptions qui sont ensuite gérées dans le code principal, ce qui permet de varier la gestion de ces exceptions en fonctions du besoin.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Salut,

    L'intérêt que j'avais de lever une exception directement dans cette méthode était de ne pas le faire à chaque fois que j'avais un put à faire.

    La gestion de l'exception n'était pas vraiment finie je te l'accorde et là elle ne sert pas à grand chose. Mais on peut imaginer une une classe Exception_Fichier étendue d'Exception et qui gère cette partie là, en envoyant une alerte quand on arrive dans le catch dans cette méthode par exemple.

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Salut,
    c'est super,
    i will use it
    merci

Discussions similaires

  1. Class ou Package pratique (ex: gestion des fichiers plats)
    Par vandeyy dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 03/03/2014, 18h08
  2. [VB.NET] Classe qui pilote des Fichier .INI
    Par sygale dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/06/2004, 20h04
  3. [JDOM] Gestion "gros fichiers"
    Par Haazheel dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 17/10/2003, 13h42
  4. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo