Précédent   Forum des professionnels en informatique > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 21/09/2009, 18h46   #1 (permalink)
Rédacteur
 
Date d'inscription: janvier 2004
Localisation: Lyon
Âge: 26
Messages: 7 897
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 :
/**
 * 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 :
$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 :
$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 :
$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 );
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/09/2009, 09h43   #2 (permalink)
Modérateur
 
Avatar de s.n.a.f.u
 
Date d'inscription: août 2006
Localisation: Nantes
Âge: 35
Messages: 2 422
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 :
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 :
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)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 25/09/2009, 11h12   #3 (permalink)
Rédacteur
 
Date d'inscription: janvier 2004
Localisation: Lyon
Âge: 26
Messages: 7 897
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.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/01/2010, 10h29   #4 (permalink)
Invité de passage
 
Nom : Cherkaoui Mohammed
Date d'inscription: janvier 2010
Messages: 2
Par défaut

Salut,
c'est super,
i will use it
merci
THE-PHP-LOVER est déconnecté   Envoyer un message privé Réponse avec citation
NEWS PHPFAQ PHPCours PHPSources PHPLivres PHPScripts PHPOutils PHPComparatifsZend Framework

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > PHP > Langage > Contribuez



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 10h34.


Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.