8795 sujets

Développement web côté serveur, CMS

Bonjour à toutes et à tous!
Voilà j'aimerais construire un script php qui permette une synchronisation entre une arborescence de fichiers existante sur le disque dur et une arborescence de fichiers d'un XML.
Je m'explique : Dans le cadre du développement d'un intranet, un certain nombre de documents sont mis à disposition des utilisateurs. Tous ces documents sont placés dans un même répertoire bien ciblé et connu. L'ajout de nouveaux documents se fait par un formulaire via l'intranet. Tout cela est enregistré dans un fichier XML.
Cependant pour palier à un certain nombre de soucis, et d'ajouts de documents non réglementaires, j'aimerais faire une comparaison entre l'état de l'arborescence du DD avec celle du XML.
Dans un premier temps, j'aimerais faire en sorte que l'on me notifie d'un changement de nom d'un répertoire.

Exemple du xml

<root>
<sources>
<contenu>
<documentation>
</root>

Exemple de l'arborescence sous l'explorateur:
- sources
- contenu
- truc

Et la réaction attendue serait:
une fenêtre indiquant qu'il y a un ajout du répertoire "truc"
une seconde fenêtre indiquant que "documentation" a été supprimé.


Et l'étape suivant serait de comparer l'arborescence de truc(sur le DD) et de documentation(dans le XML) et vérifier si c'est le même ou non et ainsi demander l'on change le nom ou pas.


Enfin en gros, ça ressemblerait beaucoup à de la synchronisation.

Merci d'avance pour votre aide
Dans le cadre de ce que je souhaite faire, je suis déjà opposé à un petit soucis.
J'ai récupéré ce code qui permet d'afficher le contenu d'un répertoire tel un explorateur basique:
<?php

// on definie la fonction listfile() avec en argument le dossier a explorer
function listfile($from) 
{
	$dossier = opendir($from); // on ouvre le dossier
	while ($fichier = readdir($dossier)) 
	{ // boucle qui s'execute tant qu'on est pas a la fin de la liste de fichier
		$l = array('.', '..','index.php'); // pour pas que la page en cours ou les dossier .. ou . apparaissent, on les met dans un array...
		if (!in_array( $fichier, $l))
		{ // ... et on compare.
			$_file_ = $from."/".$fichier; // variable $_file_ = chemin du fichier trouvé, relatif a la page en cours.
			if (is_dir($_file_))
			{ // si ce "fichier" est un dossier
				print("dir :: <a href=$PHP_SELF?url=$_file_>$_file_</a><br>"); // on crée un lien permettant de l'explorer (passage en variable, voir plus bas)
			} 
			else
			{
				print("file :: <a href=$_file_>$_file_</a><br>"); // sinon on fait un lien vers ce fichier.
			}
		}
	}
}

if($_GET['url'])
{
	$d = $_GET['url'];
}

if (isset($d)) 
{ // si la variable $d existe, on explore le dossier $d
	listfile($d);
} 
else 
{
	listfile("./contenu"); // sinon on explore le dossier courrant.
}
?>


Cependant, tout le chemin est spécifié dans l'url, et le nom des sous-répertoire contient aussi le nom du répertoire Smiley ohwell
Voici donc comment j'ai pensé la chose, mais ça ne semble pas marcher:
$chemin_courant = "./contenu";
function listfile2($file) 
{
	$dossier = opendir($chemin_courant."/".$file); // on ouvre le dossier
	while ($fichier = readdir($dossier)) 
	{ // boucle qui s'execute tant qu'on est pas a la fin de la liste de fichier
		$l = array('.', '..','index.php'); // pour pas que la page en cours ou les dossier .. ou . apparaissent, on les met dans un array...
		if (!in_array( $fichier, $l))
		{ // ... et on compare.
			$_file_ = $chemin_courant."/".$fichier; // variable $_file_ = chemin du fichier trouvé, relatif a la page en cours.
			if (is_dir($_file_))
			{ // si ce "fichier" est un dossier
				print("dir :: <a href=$PHP_SELF?url=$fichier>$fichier</a><br>"); // on crée un lien permettant de l'explorer (passage en variable, voir plus bas)
			} 
			else
			{
				print("file :: <a href=$fichier>$fichier</a><br>"); // sinon on fait un lien vers ce fichier.
			}
		}
	}
	$chemin_courant = $chemin_courant."/".$fichier;
}

if($_GET['url'])
{
	$d = $_GET['url'];
}

if (isset($d)) 
{ // si la variable $d existe, on explore le dossier $d
	listfile2($d);
} 
else 
{
	$chemin_courant = "./contenu";
	listfile2("");
}
?>


Si quelqu'un a une idée, il est le bienvenue........
Merci d'avance
Bon eh bien j'ai réussi à avancer un peu. Mais un problème subsiste.
Tout d'abord voici mon code:
$chemin_courant = "./contenu";
function listfile2($file) 
{
	global $chemin_courant;
	$chemin_courant = $chemin_courant."/".$file;
	//echo $chemin_courant."<br />";
	$dossier = opendir($chemin_courant); // on ouvre le dossier
	while ($fichier = readdir($dossier)) 
	{ // boucle qui s'execute tant qu'on est pas a la fin de la liste de fichier
		$l = array('.', '..','index.php'); // pour pas que la page en cours ou les dossier .. ou . apparaissent, on les met dans un array...
		if (!in_array( $fichier, $l))
		{ // ... et on compare.
			$_file_ = $chemin_courant.$fichier; // variable $_file_ = chemin du fichier trouvé, relatif a la page en cours.
			if (is_dir($_file_))
			{ // si ce "fichier" est un dossier
				print("dir :: <a href=$PHP_SELF?url=$fichier>$fichier</a><br>"); // on crée un lien permettant de l'explorer (passage en variable, voir plus bas)
			} 
			else
			{
				print("file :: <a href=$fichier>$fichier</a><br>"); // sinon on fait un lien vers ce fichier.
			}
		}
	}
	
}

if($_GET['url'])
{
	$d = $_GET['url'];
}

if (isset($d)) 
{ // si la variable $d existe, on explore le dossier $d
	listfile2($d);
} 
else 
{
	listfile2("");
}
?>


Donc cette fois-ci, ne s'affiche dans l'url que le nom du fichier ou dossier sélectionné. Et le nom des sous répertoires ou fichiers ne font plus référence aux répertoires pères.
Cependant, ce script est justelent censé faire la différence entre un fichier et un répertoire. Sauf que cette distinction n'est faite que pour mon répertoire défini comme racine. Dès que je rentre dans un répertoire ensuite, tout le contenu est détecté comme étant un fichier...
Si quelqu'un a une solution ce serait super sympa.
Merci
Je penses qu'il y a un problème dans l'adresse du fichier ce qui fait que
if (is_dir($_file_))
est executé sur un fichier/dossier inexistant et retourne faux.

EDIT: oui c'est ça: il manque un slash:
$_file_ = $chemin_courant[b].'/'.[/b]$fichier;


De plus je te fais remarquer que ton script est potentiellement une faille de sécurité sur ton site. Imagine que quelqu'un y fasse appel avec
tonfichier.php?url=../../undossier
Il a accès à toute l'arboressence de ton site y compris le dossier de sessions par exemple selon l'hebergeur.
Modifié par Necromantik (27 Jul 2007 - 12:17)
En effet, comme je n'avais jamais eu à travailler avec un chemin d'accès jusque maintenant, je ne m'étais pas posé la question...

Merci pour ces précisions, je vais essayer de changer tout ça