système de fichiers (fputs et filemtime)
Hors ligneJekkil Le 18/04/2006 à 01:54 Profil de Jekkil Configuration de Jekkil

Bonjour,
Je me suis récemment mis à la lecture/écriture de fichiers en php, et j'ai quelques questions (plutôt que problèmes).

Ma première concerne le filemtime. Je l'utilise pour que la page puisse être rafraichie sans que le fichier ne puisse être modifié avant qu'un certain temps ne se soit écoulé :



<?php
$file
= fopen("doc/file", "r+");
if ((
date("U")-date("U", filemtime($file)))>30) {
   //opération
}
touch($file);
fclose($file);
?>


A la première exécution du code, cette erreur apparaît :
Warning: filemtime(): Stat failed for Resource id #8 (errno=2 - No such file or directory)
et il renvoit la date du premier janvier 1970. Je me suis dit que le fichier ne devait pas avoir de date de dernière modification, alors j'ai essayé de la forcer avec un touch(). Cela a pour effet de créer un fichier complètement vide nommé Resource id #8. Je ne comprends pas d'où vient ce nom (le même que dans l'erreur), ni pourquoi ce fichier est créé. De plus, je modifie le fichier depuis plusieurs pages, et il est créé un fichier Resource id# différent à chaque fois...
Une fois que les fichiers Resource id# ont été créés, l'erreur n'apparaît plus.

-> Est-il possible de récupérer l'heure de dernière modification sans générer cette erreur et en évitant la création de fichiers Resource id#.

Ma deuxième question peut paraître stupide, et montre mon niveau de débutant :
Je voudrais écrire trois valeurs, et les écrire chacune sur une ligne différente. Mais les fputs se contentent de concaténer les nouvelles valeurs au précédentes. Je n'arrive pas à aller à la ligne... (à noter que les trois valeurs ont des longueurs variables).
J'ai utilisé une solution annexe en les écrivant sur la même ligne et en utilisant un fgetscv(), mais j'aimerais néanmoins savoir comment aller à la ligne... Ca pourra toujours me servir.

D'avance merci beaucoup.
Hors ligneMalalam Le 18/04/2006 à 08:14 Profil de Malalam Configuration de Malalam

Hello,



vite fait :



fopen renvoie un pointeur vers un fichier; autrement dit, dans le monde de php, une ressource de type pointeur vers un fichier.

Les ressources sont tjrs "nommées" ainsi : resource id #n

Certaines fonctions de fichiers nécessitent ce type de ressources (fgets par exemple, fwrite etc...)



Tu ouvres donc un fichier nommé "doc/file" avec fopen.

Tu testes la date, et selon ton test, tu effectues ton opération.



Mais filemtime prend non pas une ressource, mais un chemin vers ton fichier!

http://fr.php.net/manual/fr/function.filemtime.php

Or tu lui passes une ressource. Et d'emblée, ce fichier n'existe pas.

Puis tu fais un touch sur $file...or, touch non plus ne prend pas une ressourcen mais un nom de fichier aussi comme filemtime (une chaîne quoi)

http://fr.php.net/manual/fr/function.touch.php

Du coup, touch prend la chaîne que contient $file, à savoir le nom de ta ressource et crée un fichier avec cette chaîne pour nom.


Bref, tu utilises mal ces fonctions.

Pour aller à la ligne dans un fichier texte : \r\n, ou \n, mais ça dépend de ton OS. Ceci dit, \r\n sera probablement ok.
Hors ligneJekkil Le 18/04/2006 à 14:38 Profil de Jekkil Configuration de Jekkil

Salut Malalam,

Ok ! J'ai compris mon erreur pour les filemtime() et touch(). Le pire (et j'en ai honte ) c'est qu'avant de venir demander sur le forum j'étais allé voir exactement sur les même liens que tu m'as donnés... Mais avec ton explication, ça va tout de suite mieux.

Donc si j'ai bien compris, le code corrigé serait :

<?php
$file
= fopen("doc/file", "r+");
if ((
date("U")-date("U", filemtime("doc/file")))>30) {
   //opération
}
touch("doc/file");
fclose($file);
?>


En tout cas, merci beaucoup.
Hors ligneMalalam Le 18/04/2006 à 14:57 Profil de Malalam Configuration de Malalam

Et il sert à quoi le fopen, du coup...?
Hors ligneJekkil Le 18/04/2006 à 19:10 Profil de Jekkil Configuration de Jekkil

Je dois lire et mettre à jour les données que contient le fichier.
Mais maintenant, c'est vrai que je peux le mettre à l'intérieur de la condition... ça m'évitera de l'ouvrir si je n'ai pas de modification à faire.
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels