Subversion Repositories Applications.framework

Rev

Rev 273 | Rev 299 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
220 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Classe fournissant des méthodes statiques de manipulation des fichiers.
5
 *
6
 * @category	PHP 5.2
7
 * @package	Utilitaire
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @copyright	Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
10
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
11
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
240 jpm 12
 * @version	$Id$
220 jpm 13
 * @link		/doc/framework/
14
 */
15
class Fichier {
16
	/**
17
	 * Créer et stocke du contenu dans un fichier.
18
	 *
19
	 * @param string le chemin et le nom du fichier.
20
	 * @param string le contenu à stocker dans le fichier.
21
	 * @return string true en cas de succès sinon false.
22
	 */
23
	public static function creerFichier($fichier, $contenu) {
24
		$erreur = null;
25
 
26
		// Début de l'écriture du fichier
27
		if ($resource = fopen($fichier, 'w')) {
28
			if (!fwrite($resource, $contenu)) {
29
				if (!fclose($resource)) {
30
					$erreur = "Le fichier '$fichier' n'a pas pu être fermé.";
31
				}
32
			} else {
33
				$erreur = "Le contenu texte n'a pas pu être écrit dans le fichier '$fichier'.";
34
			}
35
		} else {
36
			$erreur = "Le fichier '$fichier' n'a pas pu être ouvert.";
37
		}
38
 
39
		// Gestion des erreurs et du retour
40
		if (is_null($erreur)) {
41
			return true;
42
		} else {
43
			trigger_error($erreur, E_USER_WARNING);
44
			return false;
45
		}
46
	}
47
 
48
	/**
49
	 * Créer et stocke du contenu dans un fichier compressé en Gzip.
50
	 *
51
	 * @param string le chemin et le nom du fichier.
52
	 * @param string le contenu à stocker dans le fichier.
53
	 * @return string true en cas de succès sinon false.
54
	 */
55
	public static function creerFichierGzip($fichier, $contenu) {
56
		$erreur = null;
57
 
58
		// Ajout de l'extension gz
59
		if (substr($fichier, -3) != '.gz') {
60
			$fichier = $fichier.'.gz';
61
		}
62
 
63
		// Début de l'écriture du fichier compressé
64
		if ($resource = gzopen($fichier, 'w9')) {
65
			if (gzwrite($resource, $contenu)) {
66
				if (!gzclose($resource)) {
67
					$erreur = "Le fichier compressé '$fichier' n'a pas pu être fermé.";
68
				}
69
			} else {
70
				$erreur = "Le contenu texte n'a pas pu être écrit dans le fichier compressé '$fichier'.";
71
			}
72
		} else {
73
			$erreur = "Le fichier compressé '$fichier' n'a pas pu être ouvert.";
74
		}
75
 
76
		// Gestion des erreurs et du retour
77
		if (is_null($erreur)) {
78
			return true;
79
		} else {
80
			trigger_error($erreur, E_USER_WARNING);
81
			return false;
82
		}
83
	}
84
 
85
	/**
86
	 * Supprime récursivement un dossier et tout son contenu.
87
	 *
88
	 * @param string $dossier le chemin vers le dossier à supprimer.
89
	 * @return void
90
	 */
91
	public static function supprimerDossier($dossier) {
92
		if (is_dir($dossier)) {
93
			$objets = scandir($dossier);
94
			foreach ($objets as $objet) {
95
				if ($objet != '.' && $objet != '..') {
96
					$chemin = $dossier.'/'.$objet;
97
					if (filetype($chemin) == 'dir') {
98
						$this->supprimerDossier($chemin);
99
					} else {
100
						unlink($chemin);
101
					}
102
				}
103
			}
104
			reset($objets);
105
			rmdir($dossier);
106
		}
107
	}
108
 
109
	/**
110
	 * Convertion d'un nombre d'octet en kB, MB, GB.
111
	 * @link http://forum.webmaster-rank.info/developpement-site/code-taille-memoire-d-une-variable-en-php-t1344.html
112
	 * @param integer $taille la taille en octet à convertir
113
	 *
114
	 * @return string la chaine représentant la taille en octets.
115
	 */
116
	public static function convertirTaille($taille) {
273 jpm 117
		$unite = array('B', 'kB', 'MB', 'GB');
118
		return @round($taille / pow(1024, ($i = floor(log($taille,1024)))), 2).' '.$unite[$i];
220 jpm 119
	}
273 jpm 120
 
121
	/**
122
	 * Détermine le dossier système temporaire et détecte si nous y avons accès en lecture et écriture.
123
	 *
124
	 * Inspiré de Zend_File_Transfer_Adapter_Abstract & Zend_Cache
125
	 *
126
	 * @return string|false le chemine vers le dossier temporaire ou false en cas d'échec.
127
	 */
128
	public static function getDossierTmp() {
129
		$dossier_tmp = false;
130
		foreach (array($_ENV, $_SERVER) as $environnement) {
131
			foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $cle) {
132
				if (isset($environnement[$cle])) {
133
					if (($cle == 'windir') or ($cle == 'SystemRoot')) {
134
						$dossier = realpath($environnement[$cle] . '\\temp');
135
					} else {
136
						$dossier = realpath($environnement[$cle]);
137
					}
138
					if (self::etreAccessibleEnLectureEtEcriture($dossier)) {
139
						$dossier_tmp = $dossier;
140
						break 2;
141
					}
142
				}
143
			}
144
		}
145
 
146
		if ( ! $dossier_tmp) {
147
			$dossier_televersement_tmp = ini_get('upload_tmp_dir');
284 jpm 148
			if ($dossier_televersement_tmp) {
273 jpm 149
				$dossier = realpath($dossier_televersement_tmp);
150
				if (self::etreAccessibleEnLectureEtEcriture($dossier)) {
151
					$dossier_tmp = $dossier;
152
				}
153
			}
154
		}
155
 
156
		if ( ! $dossier_tmp) {
157
			if (function_exists('sys_get_temp_dir')) {
158
				$dossier = sys_get_temp_dir();
159
				if (self::etreAccessibleEnLectureEtEcriture($dossier)) {
160
					$dossier_tmp = $dossier;
161
				}
162
			}
163
		}
164
 
165
		if ( ! $dossier_tmp) {
166
			// Tentative de création d'un fichier temporaire
167
			$fichier_tmp = tempnam(md5(uniqid(rand(), TRUE)), '');
168
			if ($fichier_tmp) {
169
				$dossier = realpath(dirname($fichier_tmp));
170
				unlink($fichier_tmp);
171
				if (self::etreAccessibleEnLectureEtEcriture($dossier)) {
172
					$dossier_tmp = $dossier;
173
				}
174
			}
175
		}
176
 
177
		if ( ! $dossier_tmp && self::etreAccessibleEnLectureEtEcriture('/tmp')) {
178
			$dossier_tmp = '/tmp';
179
		}
180
 
181
		if ( ! $dossier_tmp && self::etreAccessibleEnLectureEtEcriture('\\temp')) {
182
			$dossier_tmp = '\\temp';
183
		}
184
 
185
		return $dossier_tmp;
186
	}
187
 
188
	/**
189
	 * Vérifie si le fichier ou dossier est accessible en lecture et écriture.
190
	 *
191
	 * @param $ressource chemin vers le dossier ou fichier à tester
192
	 * @return boolean true si la ressource est accessible en lecture et écriture.
193
	 */
194
	protected static function etreAccessibleEnLectureEtEcriture($ressource){
195
		$accessible = false;
196
		if (is_readable($ressource) && is_writable($ressource)) {
197
			$accessible = true;
198
		}
199
		return $accessible;
200
	}
220 jpm 201
}
202
?>