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

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Source : Classe de gestion de fichier en PHP5

Le , par Bisûnûrs

0PARTAGES

0  0 
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
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
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
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
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 );

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de s.n.a.f.u
Membre expert https://www.developpez.com
Le 25/09/2009 à 9:43
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
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
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.
0  0 
Avatar de Bisûnûrs
Modérateur https://www.developpez.com
Le 25/09/2009 à 11:12
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.
0  0 
Avatar de THE-PHP-LOVER
Candidat au Club https://www.developpez.com
Le 27/01/2010 à 10:29
Salut,
c'est super,
i will use it
merci
0  0