Le système de fichiers
Travail
sur les fichiers
Ouverture
La fonction
fopen() permet d'ouvrir ou de créer un fichier selon divers modes. Elle prend
en premier
pramètre le nom du
fichier avec son chemin. Ce nom de fichier peut être une URL (il faut pour cela
que la
directive allow_url_fopen soit
activée dans le php.ini). Le second paramètre est le mode
d'ouverture :
– r :lecture seule, en début
de fichier
– r+: lecture/écriture, en
début de fichier
– w : écriture seule ,
taille du fichier à 0 (ancien contenu effacé), créé s'il n'existe pas
– w+ : lecture/écriture,
taille du fichier à 0, créé s'il n'existe pas
– a : écriture seule, en fin
de fichier, créé s'il n'existe pas
– a+ : lecture/écriture, en
fin de fichier, créé s'il n'existe pas.
On peut sous
Windows rajouter la lettre 'b' pour le type binaire, inutile sous Unix.
Enfin, fopen()
admet un troisième paramètre : 1. Dans ce cas le fichier à ouvrir sera
recherché dans
le include_path
(voir php.ini).
La valeur
retournée est une ressource de fichier (identifiant de fichier) ou la valeur
FALSE en cas
d'échec.
$file=fopen('server.log','a+',1);
Lecture
fgets()
La fonction
fgets() permet de
lire une ligne
d'un fichier en
mode texte. La
fonction s'arrête
lorsqu'elle arrive
à la fin du fichier ou à un retour chariot. On peut préciser en second
paramètre une
longueur de texte
en octet qui est par défaut 1024 et ce paramètre est obligatoire avant les
versions
4.2. Le premier
paramètre est l'identifiant du
fichier. FALSE sera
retourné en cas
d'erreur.
ATTENTION :
fgets() ne retourne pas FALSE à la fin du fichier.
$ligne=fgets($file);
fread();
La fonction
fread() permet de lire un fichier en mode binaire. Le second paramètre est la
longueur
souhaitée. Sous
Windows il faut penser à placer 'b' dans fopen(). La lecture s'arrête lorsque
les n
octets (longueur)
ont été lus, la fin du fichier a été atteinte ou qu'une erreur est survenue.
S. ROHAUT Cours
Programmation PHP Page 51/93$file=fopen('monimage.gif','rb');
$img=fread($file, $filesize('nomimage.gif'));
fclose($file);
fscanf()
La fonction
fscanf() lit des lignes d'un fichier en fonction d'un formatage particulier.
$file=fopen('users.txt','r');
while($ligne=fscanf($file,"%s\t%s\t%s\n")) {
echo $ligne;
}
fgetc()
La fonction
fgetc() lit un seul caractère dans le fichier. Contrairement à fgets(), elle
retourne FALSE
à la fin du
fichier. Le premier paramètre est l'identifiant du fichier.
fgetss()
La fonction
fgetss() fonction est identique à
fgets() mais la ligne retournée est débarrassée de ses
éventuelles
balises PHP ou HTML. On peut préciser en
troisième paramètre une liste de
balises
autorisées.
fgetcsv()
La fonction
fgetcsv() est une fonction très puissante car elle permet de lire un fichier de
type CSV,
c'est à dire dont
les champs sont délimités, pour
récupérer les champs dans
un tableau. Lesond
paramètre est la
longueur maximale d'une ligne du fichier, le troisième paramètre le séparateur,
qui
est la virgule par
défaut.
Voici un exemple permettant de
lire un fichier CSV et d'en afficher
le résultat sous forme d'un
tableau HTML :
$filename = "book1.csv";
$id = fopen($filename, "r");
while ($data = fgetcsv($id,
filesize($filename))) $table[] = $data;
fclose($id);
echo "<table>\n";
foreach($table as $row) {
echo "<tr>";
foreach($row as $data) echo "<td>$data</td>";
echo "</tr>\n";
}
echo "</table>\n";
11.1.2.7 Renvoyer un
fichier par la sortie standard
La fonction readfile()
prend comme paramètre un nom de fichier et renvoie son contenu par la
sortie standard.
La fonction readgzfile()
effectue la même chose mais le
fichier est au
format
compressé gzip
(zlib).
S. ROHAUT Cours
Programmation PHP Page 52/9311.1.3 Ecriture
Les deux
fonctions fwrite() et
fputs() sont identiques 100% car fputs()
est un alias de fwrite().
Elles
écrivent une chaîne dans un
fichier. On peut limiter
la longueur de la chaîne en
troisième
paramètre mais par
défaut toute la chaîne est écrite. La valeur retournée est le nombre d'octets
écrits,
ou FALSE en cas
d'erreur.
$file=fopen('monfic.txt','a);
$ret=fwrite($file,'Une
ligne dans mon fichier');
fclose($file);
En cas de travail
sur un fichier binaire, il ne faut pas oublier sous Windows de rajouter
l'option 'b'.
Déplacement
fseek()
La fonction
fseek() permet de se
déplacer dans un
fichier. Le second paramètre (offset)
est le
nombre d'octets de
déplacement. Il peut être négatif. Par défaut le déplacement est calculé à
partir
du début du
fichier mais un troisième paramètre peut modifier cet état. La valeur retournée
est 0
(zéro) en cas de réussite,
-1 sinon. Un positionnement après la fin du fichier n'est pas une erreur.
– SEEK_SET : Calcul à partir
du début du fichier. Position finale : Début+offset
– SEEK_CUR : Calcul à partir
de l'emplacement actuel. Position finale : Actuelle+offset
– SEEK_END : Calcul à partir
de la fin du fichier. Position finale : Fin+Offset.
$ret=fseek($file,0,
SEEK_END); // Fin du fichier
ftell()
La fonction
fseek() renvoie la position actuelle du pointeur dans le fichier.
$pos=ftell($file);
rewind()
La fonction
rewind() permet de
retourner au début du
fichier. Elle retourne TRUE en cas de
réussite, FALSE
sinon.
La fonction feof()
indique si on est à la fin du fichier ou non. Elle retourne TRUE si la fin de
fichier
a été atteinte,
FALSE sinon.
$fd = fopen ("/tmp/inputfile.txt",
"r");
while (!feof ($fd)) {
$buffer = fgets($fd, 4096);
echo $buffer;
}
fclose ($fd);
S. ROHAUT Cours
Programmation PHP Page 53/9311.1.6 Fermeture
On ferme un
fichier avec la fonction fclose().Elle retourne TRUE en cas de réussite, FALSE
sinon.
11.2 Travail sur les
répertoires
11.2.1 Répertoire actuel
La fonction
getcwd() retourne le nom
du dossier de travail
courant, c'est à dire
là où on est.
Attention sous Windows
: cette fonction ne
fait pas de distinctions entre
les majuscules et les
minuscules.
$chemin=getcwd();
echo $ chemin
; :: /srv/www/site
11.2.2 Se déplacer
On se déplace
avec la
fonction chdir(). L'argument
peut être absolu ou relatif.
En cas d'erreur,
FALSE est retourné.
if(chdir('./rep'))
getcwd();
else
die('Impossible de se déplacer');
Ouvrir,
lister, fermer
On ouvre un
répertoire en lecture avec la fonction opendir() qui prend comme unique
paramètre un
nom ou chemin
de répertoire. En cas d'échec, la
fonction retourne FALSE sinon
un identifiant
(handler) de répertoire.
On lit une entrée
avec la fonction readdir() qui prend comme paramètre l'identifiant de
répertoire.
Quand il n'y a
plus rien à lire, la fonction retourne FALSE sinon elle retourne le nom de
l'entrée
actuellement lue.
ATTENTION, les entrées « . » et « .. » sont lues comme les autres.
On ferme un
répertoire en cours de lecture avec la fonction closedir() qui prend comme
paramètre
l'identifiant de
répertoire.
$handle=opendir('.');
while ($file = readdir($handle)) {
if ($file !=
"." && $file
!= "..") {
echo "$file\n";
}
}
closedir($handle);
On peut retourner
au début du répertoire avec la fonction rewinddir() qui prend comme paramètre
un identifiant de
répertoire. La prochaine lecture sera la première du répertoire.
11.2.4 Récupérer toutes les
entrées
Même s'il
est possible de
récupérer l'ensemble des
entrées d'un répertoire
avec les fonctions
S. ROHAUT Cours
Programmation PHP Page 54/93précédentes et une boucle, la fonction scandir()
propose la même chose, en une ligne et en plaçant
tous les noms de
fichiers du chemin indiqué dans un tableau. Le premier paramètre est un chemin
de
répertoire. Le
second est optionnel et définit l'ordre du tri qui est alphabétique par défaut.
Un « 1 »
indique un tri
alphabétique décroissant.
$files=scandir('./rep');
print_r($files);
Travail
sur le système de fichiers
Informations sur le fichier
On peut obtenir
diverses informations sur un fichier à l'aide des commandes de type is_x() :
– is_dir() : TRUE si le nom
de fichier est un répertoire
– is_file() : TRUE si le nom
de fichier est un véritable fichier normal
– is_executable() : TRUE si
le fichier est exécutable. Sous Windows il faut PHP 5.x.
– is_readable() : TRUE sir
le fichier est lisible
– is_writeable(),
is_writable() : TRUE si le fichier est accessible en écriture
– is_link() : TRUE si le
fichier est un lien.
De même, on peut
obtenir des détails sur un fichier avec les fonctions filexxx() :
– file_exists() : TRUE si le
fichier existe
– fileatime() : retourne sous forme de TIMESTAMP la
dernière date d'accès. Sous Windows, ce
sera la dernière
date de modification.
– filectime() : retourne la
date de création
– filemtime() : retourne la
date de modification
– filegroup() : retourne le GID du fichier. On récupère le nom réel du groupe avec la fonction
posix_getgrgid().
– fileowner() : retourne le
UID du fichier. On récupère le nom réel de l'utilisateur avec la fonction
posix_getpwuid().
– fileinode() : retourne
l'inode du fichier
– fileperms() :
retourne les permissions du fichier.
ATTENTION le résultat
est en base 10. Il
faudra convertir
en base 8 avec la fonction base_convert().
– filesize() : retourne la
taille du fichier en octets.
S. ROHAUT Cours
Programmation PHP Page 55/93– filetype() : retourne le type du fichier.
ATTENTION il s'agit des types de fichiers sur disque, pas
de leur contenu
(image, etc) : fifo, char, dir, block, link, file, unknown.
Si un fichier est déjà ouvert
on peut obtenir des informations avec la fonction
fstat() qui prend
comme paramètre un
identifiant de fichier retourné par fopen() et qui retourne un tableau indexé
numériquement ou associatif. La
fonction stat() retourne
la même chose mais on lui précise un
chemin ou nom de
fichier. La fonction lstat() est quasi-identique sauf que dans le cadre du
lien, ce
sont les
informations sur le lien lui-même (et pas le fichier pointé) qui sont
retournées.
0. volume (ou encore dev)
1. inode (ou encore ino)
2. droits d'accès
au fichier (mode
de protection du
inode). A convertir
en octal. Voir
aussi
fileperms(). (ou
encore mode)
3. nombre de liens (ou encore
nlink)
4. id de l'utilisateur
propriétaire (ou encore uid)
5. id du groupe propriétaire
(ou encore gid)
6. type du volume de l'inode
* (ou encore rdev
)
7. taille en octets (ou
encore size)
8. date du dernier accès (ou
encore atime)
9. date de la dernière
modification (ou encore mtime)
10.date du dernier changement
(ou encore ctime)
11.taille de bloc du système
pour les entrées/sorties * (ou encore blksize)
12.nombre de blocs alloués
(ou encore blocks)
11.3.2 Actions sur les fichiers
et répertoires
On retrouve ici
des fonctions qui portent souvent le même nom que leurs équivalents sous le
shell
Unix :
– dirname(), basemane() :
isolent le chemin et le nom d'un fichier
– chown(), chgrp() :
changent le propriétaire et le groupe d'un fichier. Le premier paramètre est le
fichier, le second
le groupe ou le propriétaire (UID, GID, ou en toutes lettres)
– chmod() : modifie les
droits. Le premier paramètre est le nom du fichier, le second les droits en
octal. ATTENTION sous Windows, les résultats peuvent
surprendre...
S. ROHAUT Cours
Programmation PHP Page 56/93– copy() : copie d'un fichier : source et
destination
– link() : créé un lien hard
link: cible, nom du lien
– symlink() : créé un lien
symbolique : cible, nom du lien
– mkdir() :
créé un répertoire,
le second paramètre est
le mode (droits
par défaut) AVANT
application du
masque.
– rename() : renomme et/ou
déplace un fichier : orgine, destination.
– rmdir() : supprime un
répertoire. Il doit être vide.
– unlink() : supprime un
fichier.
– umask() : modifie le umask
par défaut
Upload
de fichiers
L'upload de
fichiers permet d'envoyer
depuis un poste
client un fichier
sur le serveur.
Cette
opération
nécessite un navigateur sachant prendre en charge une balise spéciale et
l'appel d'un script
PHP.
Côté Page HTML, il
faut modifier la définition d'un formulaire, placer le champ formulaire de type
FILE et
indiquer la taille
maximale du fichier
téléchargé avec un
nom HIDDEN de
bom
MAX_FILE_SIZE. Cette
taille est précisée
en octets. Ce
champ doit être
placé AVANT
l'apparition du
champ de type FILE.
Le formulaire doit
être de type POST (bien que GET soit possible, voir documentation PHP) et le
type d'encodage
ENCTYPE "/multipart/form-data" doit être précisé.
<form ENCTYPE="multipart/form-data"
action="/page.php" method="post">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE"
value="35840">
<INPUT NAME="avatar" TYPE="file" SIZE=50>
<input type="submit" value="Enregistrer"/>
</form>
Notes :
Certains navigateurs se
fichent totalement du poid
(taille) des fichiers
envoyés en ne
réagissant pas à
la variable MAX_FILE_SIZE. Dans ce cas la vérification doit être faite du côté
du
serveur. Au
pire on peut
limiter côté serveur
la taille maximale
à l'aide du
paramètre
upload_max_filesize
dans le php.ini.
On choisit son fichier via la boite de dialogue du
gestionnaire de fichiers quand on clique sur le
bouton Parcourir.
Une fois le formulaire validé, les données du formulaire et le fichier sont
envoyés
à la page PHP.
Côté PHP, on
récupère les informations sur le fichier uploadé via un tableau $_FILE dont les
index
sont les suivants
$_FILE[nom][propiete] le nom étant le nom du champ du formulaire FILE et la
propriété :
– $_FILES['userfile']['name']
: Le nom original du fichier, tel que sur la machine du client web.
S. ROHAUT Cours
Programmation PHP Page 57/93– $_FILES['userfile']['type'] : Le type MIME du
fichier, si le navigateur a fourni cette information.
Par exemple, cela
pourra être "image/gif"
– $_FILES['userfile']['size']
: La taille, en octets, du fichier téléchargé.
– $_FILES['userfile']['tmp_name']
: Le nom temporaire du fichier qui sera chargé sur la machine
Serveur.
– $_FILES['userfile']['error']
: Le code d'erreur associé au téléchargement de fichier (PHP 4.2)
Par défaut le
fichier téléchargé et en attente de déplacement est placé dans le répertoire
temporaire
du système
(variable système TEMP ou TMPDIR) ou dans le répertoire précisé par le
paramètre de
configuration upload_tmp_dir du
fichier php.ini. Il
est conseillé d'initialiser et
d'utiliser ce
paramètre. Le
chemin du fichier temporaire uploadé est donc :
$tmp_file=ini_get("upload_tmp_dir").'/'.$_FILE['userfile']['tmp_name'];
Pour savoir
si un fichier
a été correctement uploadé
par la méthode POST, on peut
utiliser la
fonction
is_uploaded_file() qui prend comme paramètre le nom du fichier uploadé.
if(is_uploaded_file($_FILE['userfile']['name']))
{// ou tmp_name
echo $_FILES['userfile']['size'];
}
Sachant la
position du fichier temporaire uploadé et s'il a été correctement uploadé, on
peut utiliser
la fonction copy.
Mais le mieux est d'utiliser la fonction move_uploaded_file() qui teste la
réussite
de l'upload et qui
déplace le fichier. Le premier paramètre est le nom du fichier uploadé. Ce peut
être le nom du
champ FILE, le nom réel du fichier ou le nom du fichier temporaire.
if(move_uploaded_file($_FILES['avatar']['tmp_name'],$_SERVER['DOCUMENT_ROOT']."/
forum/avatars/$login".$_FILES['avatar']['name'])) {
$avatar=$login.$_FILES['avatar']['name'];
chmod($_SERVER['DOCUMENT_ROOT']."/forum/avatars/$avatar",0644);
}
S. ROHAUT Cours Programmation PHP Page 58/9312
Travail sur chaînes
12.1 Fonctions pour code HTML
et MySQL
Aucun commentaire:
Enregistrer un commentaire