Gestion de fichiers

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 105 fois - Téléchargée 14 fois

Contenu du snippet

Objet permettant de créer et gérer un fichier : ajout/modification/retrait d'éléments/remise à zéro + retour d'élément(s)(demandé(s) voire tout le fichier sous forme de tableau.

Source / Exemple :


<?php
class Gestionfichier{
	private $_fichier=Null;
	private $_filegestion=Null;
	private $_nbreitem=Null;
	public function methodes(){//retourne le nom et le nombre d'enregistrement
		echo 'raz()=Remise à zéro du fichier, return True<br />';
		echo 'ajoute()=ajoute un élément à la fin du fichier <br />';
		echo 'enleve(num)=enleve un élément choisi <br />';
		echo 'maj(num)=met à jour l\'élément choisi<br />';
		echo 'affiche()=affiche tous les éléments<br />';
		echo 'tab()=retourne les éléments du fichier sous forme de tableau<br />';
		echo 'elements(num1, num2, ...)=retourne les éléments choisis sous forme de  tableau<br />';
		echo 'nbre()=retourne le nombre d\'éléments du fichier<br />';
	}
	public function __construct($_fichier) {
       	if(!file_exists($_fichier)){$fp=fopen($_fichier,"w+");fclose($fp);}
		$this->_fichier=$_fichier;
		$this->initvar();
    }
	private function initvar(){
		$this->_filegestion=file($this->_fichier);
		$this->_nbreitem=count($this->_filegestion);
	}
	public function elements(){
		$numargs = func_num_args();
		for($i=0;$i<$numargs;$i++){
			$tabelements[]=$this->_filegestion[func_get_arg($i)];
		}
		return $tabelements;
	}
	public function maj($num,$value){
		$texte=	Null;
		foreach($this->_filegestion as $cle =>$contenu){
			if($num==$cle)$contenu=$value."\n";
			$texte.=$contenu;	
		}
		file_put_contents($this->_fichier,$texte);
		$this->initvar();
	}
	public function ajoute($value){
		$texte=implode('',$this->_filegestion);
		$texte.=$value."\n";			
		file_put_contents($this->_fichier,$texte);
		$this->initvar();
	}
	public function enleve($num){
		$texte=array();
		foreach($this->_filegestion as $cle =>$value){
			if($cle!=$num){
				$texte[]=$value;
			}
		}
		$texte=implode('',$texte);
		file_put_contents($this->_fichier,$texte);
		$this->initvar();
	}
	public function affiche(){
		foreach($this->_filegestion as $cle =>$value){
			$value=htmlspecialchars($value);
			echo $cle.'-'.$value."<br />";
		}
	}
	public function tab(){//retourne le fichier sous forme de tableau
		return $this->_filegestion	;
	}
	public function raz(){//remet le fichier a zéro
		file_put_contents($this->_fichier,'');
		$this->initvar();
		return true;	
	}
	public function nbre(){//retourne le nom et le nombre d'enregistrement
		return $this->_nbreitem;
	}
}
$fichier2=new Gestionfichier('test.txt');
//$fichier2->methodes();
//$fichier2->ajoute('element');
//$fichier2->enleve(3);
//$fichier2->maj(1,'nouveautexte');
//$fichier2->affiche();
//echo $fichier2->elements(2,4,6)[1];
//echo $fichier2->nbre().' enregistrement(s)<br />';
//$tabfichier=$fichier2->tab();
//if($fichier2->raz())echo 'Fichier vide<br /> ';
?>

A voir également

Ajouter un commentaire

Commentaires

cs_Astalavista
Messages postés
192
Date d'inscription
lundi 24 décembre 2001
Statut
Membre
Dernière intervention
3 février 2010
-
- Tu réécrit a chaque modification ton fichier (file_put_contents)
Modifie tes propriétés de class et fait un seul file_put_contents dans ton destructeur.
- Tu utilise un tableau avec la commande file(), alors pour ajouter du texte fait simplement : $this->_filegestion[] = $value;
- Plutôt que d'utiliser la méthode elements() dans ta class, regarde du coté de l'héritage de ArrayObject, sa te permeterra de faire ceci :
$obj = new Gestionfichier('monFichier.txt');
echo $obj[0];
echo $obj[10];
...
De cette façon tu enlèvera tes methodes :
- ajoute() => $obj[] = 'mon ajout';
- enleve() => unset($obj[5]);
- maj() => $obj[5] = 'Ma nouvelle ligne';
- tab() => Inutile, car accès directe.
- elements() ( Citer plus haut)
- nbre() => count($obj);

Après réflexion, tu n'auras plus que des méthodes de surcharge ...

Après, c'est juste un conseil, une idée, ... tu en fait ce que tu en veut ...
cs_emilia123
Messages postés
122
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
5 janvier 2009
-
PS : idem pour le "comptage" du nombre d'élément, cela pourrait être amélioré.
En effet, actuellement il y a un recomptage du nombre d'éléments à chaque lecture du fichier (dans initvar() ) or le nombre d'éléments n'est nécessaire que dans la fonction "nbre()" qui n'est appelée que manuellement par l'utilisateur si il le désire.
A l'heure actuelle, le "count" est effectué à chaque fois, mais il peut ne jamais servir, ou dans de très rares cas.
Le comptage devrait donc s'effectuer dans la fonction "nbre()" au lieu de le faire tout le temps => gain de performance.

EM.
cs_emilia123
Messages postés
122
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
5 janvier 2009
-
Bonjour,

La classe est pas mal faite, par contre elle pourrait être améliorée:

A)il y a des problèmes de performances sur la lecture du fichier :
Exemple pour la fonction ajoute().
1) on concatène les textes
2) on écrit tout dans le fichier
3) on appelle la fonction initvar
4) la fonction initvar recharge intégralement le fichier
5) on compte le nombre d'éléments à partir du contenu du fichier

On ne devrait pas avoir à passer par la relecture du fichier pour savoir le nombre d'éléments qu'on a.
Il faudrait gérer le tout à partir du tableau $this->_filegestion.
1) on concatène les données dans le tableau $this->_filegestion
2) on écrit tout dans le fichier
3) on compte le nombre d'élément dans le tableau $this->_filegestion

B) un autre problème de performance est le nombre d'écriture/lecture élevées.
Si par exemple je veux rajouter 50 éléments dans le fichier, je suis obligé de faire 50 écritures (et 50 lectures si on ne prend pas en compte le point A).
Il faudrait que l'ensemble des fonctions d'ajout, suppression, mise à jour n'effectue aucune écriture/lecture du fichier physique mais travaille uniquement à partir du tableau "$this->_filegestion".
Pour remplir réellement le fichier, il faudrait créer une fonction "sauvegarder()" (par exemple) qui enregistre physiquement le contenu du tableau $this->_filegestion.

C) dernière remarque : limitation au données de type texte.
Actuellement, il ne semble possible que de passer des données texte, si on passe un tableau cela ne marchera pas.
Bien que cela pourrait être à l'utilisateur de sérialiser son tableau avant l'appel de ta classe, il pourrait être pas mal de prévoir le cas ou le contenu à ajouter est un tableau, et le sérialiser automatiquement.

Bonne continuation.

EM.
Bonjour,
Je suis tombé sur cette solution, elle est similaire à celle que je recherche.

Par contre, de mon coté je voudrais regrouper des données contenues sur plusieurs classeurs dans un même feuille.

Toute en gardant la logique càd garder les même données en ligne et les mêmes colonnes.

Merci
Cordialement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_manuche)