Page 1 sur 1

FTP, savoir l'espace disque restant

Posté : 04 nov. 2008, 21:41
par chrislabricole
Bonsoir,

Je cherchai comment savoir la taille restante sur un serveur FTP, j'ai regardé du côté des commandes disponibles, et, il n'y a pas de commande déjà toute prête en FTP...

Donc, il faudrait faire un script qui permet de savoir la taille que les fichiers prennent sur le FTP.
Ne connaissez-vous pas une classe ou une fonction déjà existante ? Ça devrait déjà exister ce genre de chose je pense non ?

Si je le réalise moi-même, il faudrait faire une while qui déplie toute l'arborescence du FTP et qui additionne la taille de chaque fichiers, question performance, ça tient la route ?
Peut-être d'autres techniques ??

Merci d'avance !
PS: Vous remarquerez que mon titre du sujet est "FTP, savoir l'espace disque restant", "restant" n'est pas un problème, je connais déjà l'espace disque que je possède, je ferais donc une soustraction ;)

Re: FTP, savoir l'espace disque restant

Posté : 04 nov. 2008, 21:56
par Calimero
Je cherchai comment savoir la taille restante sur un serveur FTP, j'ai regardé du côté des commandes disponibles, et, il n'y a pas de commande déjà toute prête en FTP...
En effet, FTP est un protocole de transfert de fichiers, pas de gestion de système de fichiers (ce dont ta question relève).
Donc, il faudrait faire un script qui permet de savoir la taille que les fichiers prennent sur le FTP.
Ne connaissez-vous pas une classe ou une fonction déjà existante ? Ça devrait déjà exister ce genre de chose je pense non ?

Si je le réalise moi-même, il faudrait faire une while qui déplie toute l'arborescence du FTP et qui additionne la taille de chaque fichiers, question performance, ça tient la route ?
Peut-être d'autres techniques ??
Mauvaise idée pour la raison que tu devines déjà.

Si ton FTP est sous GNU/Linux (*nix), ton meilleur espoir réside dans la lecture du manuel (man) de commandes système telles que du et df.

df est capable de te donner l'espace libre disponible sur une partition (volume) ce qui répond à ton besoin si ça colle à l'organisation de ton FTP.

du est capable calculer une taille "approchée" d'un répertoire de manière très rapide (beaucoup plus rapide qu'en parcourant toute la structure et en additionnant les tailles).

Posté : 04 nov. 2008, 23:23
par chrislabricole
Salut,
Merci de ta réponse :)

Le problème, c'est que je suis restreins à utiliser seulement le FTP, y'a pas SSH etc... seulement un FTP ;)


Et sur ce volume, il y a des gros fichiers de moins d'1Go chacun... c'est pas des petits fichiers de 3Ko :P
Si je dit ça, c'est pour dire qu'en fait il n'y en a pas énormément ;)
Et que je pense que c'est moins lourd de traiter 40 fichiers d'environs 1Go, que 2000 fichiers de 4Ko... non ?

Afin voilà...
Je vous tiens au courant !

Posté : 04 nov. 2008, 23:42
par Calimero
Si je dit ça, c'est pour dire qu'en fait il n'y en a pas énormément ;)
Et que je pense que c'est moins lourd de traiter 40 fichiers d'environs 1Go, que 2000 fichiers de 4Ko... non ?
Oui en effet, c'est différent dans ce cas, la lecture des tailles de tous les fichiers est peut-être viable... à tester.

Les fichiers ont-ils tous la même taille ? Car si c'est le cas une simple multiplication suffit...

Posté : 05 nov. 2008, 00:04
par chrislabricole
Non, ils ont tous des tailles différentes ;)
Mais sinon, je peux faire un système de cache qui enregistre simplement la taille dans un fichier texte, et dès que le fichier dépasse une heure, on recalcule...

Donc, pour le code :
$ftp_server = 'host';
$ftp_user = 'user';
$ftp_pass = 'pass';


$conn_id = ftp_connect($ftp_server) or die('Impossible de se connecter au serveur !');

// Tentative d'identification
if ( @ftp_login($conn_id, $ftp_user, $ftp_pass) ) {
    echo 'Connecté !<br />';
} else {
    echo 'Connexion impossible !<br />';
}

$res = ftp_size($conn_id, utf8_decode('chemin à récupéré') ); // un utf8_decode() parce-que sinon, les accents ne passent pas (retourne -1)
echo $res; // pour tester, après sa sera une addition...


ftp_close($conn_id);
Ça, c'est bon, le plus dur reste à faire, récupéré tous les chemins :P

EDIT: Oula, là, franchement, je bloque :oops:
Comment faire pour que le script parcours tous les chemins ?
Je vous montre se que j'ai fais pour l'instant mais c'est loin d'être fonctionnel ;)
$current_dir = './';
$contents = ftp_nlist($conn_id, $current_dir);

$dir_size = 0;
$i = 0;
while( $i <= count($contents) ){
	if( !is_dir($contents[$i]) ){ // Je sais pas si is_dir() marche sur un FTP...
		$dir_size += ftp_size($conn_id, utf8_decode($current_dir.$contents[$i]) ); //on ajoute la taille
	} else {
		// on entre dans le dossier pour refaire une opération
	}
}
Voilà merci d'avance ! :)

Posté : 05 nov. 2008, 02:43
par furiouslol
Salut,

Pour parcourir une arborescence dont tu ne connais pas a priori la profondeur, faut faire du récursif

:lol:

Ca pique un peu au début mais apres on est tout content quand ca marche :)

Posté : 05 nov. 2008, 11:48
par AB
Tu as un exemple documenté ici

http://files.codes-sources.com/fichier_ ... taille.php

Pour la conversion du total, plutôt que d'utiliser la fonction conversion($size) (qu'est pas belle du tout) tu peux t'inspirer des deux premiers exemples de cette page http://fr2.php.net/manual/fr/function.d ... .php#81207

Posté : 05 nov. 2008, 14:53
par chrislabricole
Merci beaucoup !

Après de nombreux tests et de débeugs, j'ai enfin réussi à mettre au point cette fonction :)

La voilà pour ceux qui sont intéressé :)
function ftp_is_dir($dir){
	global $conn_id;
	if( @ftp_chdir($conn_id, $dir) ){
		//ftp_chdir($conn_id, '..');
		return true;
	} else {
		//echo 'Chemin: '. $dir;
		return false;
	}
}

function RecursiveTree($strFileName, $Used_size){
	global $conn_id;
	// on ajoute "/" si il n'en posséde pas déjà un
	if( $strFileName[strlen($strFileName)-1] != '/' ){
		$strFileName .= '/';
	}
	//si $strFileName est un répertoire
	if( ftp_is_dir($strFileName) ){

		$nlist = ftp_nlist($conn_id, $strFileName);
		//foreach( $nlist as $each_file_name ){
		foreach( $nlist as $File_name ){
				//on exclus le répertoire en cours et le répertoire parent
				//echo $strFileName.$File_name.'<br />';
				if( $File_name != "." && $File_name != ".." ){
					//on récupère le chemin complet du fichier
					$tree_Name = $strFileName . $File_name;
				
					// si c'est un répertoire on appel récursivement la fonction
					if( ftp_is_dir($tree_Name) ){
						$Used_size = $Used_size + 44;
						$Used_size = RecursiveTree($tree_Name, $Used_size);
					} else {
						//$size = filesize($tree_Name) + 36;
						$size = ftp_size($conn_id, $tree_Name ) + 36;
						$Used_size = $size + $Used_size;
						$tree_Name = $tree_Name.' '.$size;
					} // if
				} // if
		} // Foreach
	} // If ftp_is_dir()
	return $Used_size;
}
Et pour afficher le nombres d'octets prit :
echo RecursiveTree('', 0);
pour convertir en Go:
function ConvertToGo($bytes){
	$bytes = (($bytes/1024)/1024)/1024;
	$bytes = round($bytes, 2);

	return $bytes;
}
J'ai aussi profité de faire une barre :)
Ceux qui veulent savoir, demandez, là, ça dépasse un peu le sujet :P

Merci beaucoup !
Résolu :)