Source : Classe de gestion de fichier en PHP5
Le 2009-09-21 18:46:34, par Bisûnûrs, Modérateur
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 :
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 :
Exemple de rotation de log :
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; } } |
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>'; |
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 ); |
-
s.n.a.f.uMembre expertBonjour,
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
18public 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; } }
Code : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public 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; } }
le 25/09/2009 à 9:43 -
BisûnûrsModérateurSalut,
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.le 25/09/2009 à 11:12 -
THE-PHP-LOVERCandidat au ClubSalut,
c'est super,
i will use it
mercile 27/01/2010 à 10:29