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 Actualité déjà publiée
 
Outils de la discussion
Publicité
Vieux 21/09/2009, 18h46   #1
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 042
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 042
Points : 12 377
Points : 12 377
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 :
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 :
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 :
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 :
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 );
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2009, 09h43   #2
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 682
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 682
Points : 3 365
Points : 3 365
Bonjour,

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

Code :
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 :
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)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2009, 11h12   #3
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 042
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 28
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 042
Points : 12 377
Points : 12 377
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 00
Vieux 27/01/2010, 10h29   #4
Invité de passage
 
Cherkaoui Mohammed
Inscription : janvier 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : Cherkaoui Mohammed

Informations forums :
Inscription : janvier 2010
Messages : 2
Points : 1
Points : 1
Salut,
c'est super,
i will use it
merci
THE-PHP-LOVER est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 19h50.


 
 
 
 
Partenaires

Hébergement Web