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; } } |
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>'; |
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 ); |