Sur plusieurs Hostname sur le même réseau, Lecture d'espace disque ????

minusia44 - 8 août 2012 à 09:58
 minusia44 - 9 août 2012 à 12:58
Bonjour,

j'ai un encore un bug dans mon programme,

je recherches la méthodes pour que mon programme puisse lire l'espace disque de plusieurs Poste possédant des Hostname différents.

j'ai pratiquement terminé, il retrouve le Hostname d'un PC qui est connecté à mon réseau mais me donne l'espace libre de mon disque dur.

Pouvez-vous m'aider à voir plus claire.

pour le moment mon code n'est pas beau mais j'ai tout commenté pour après le refaire proprement.

public class FreeSpaceDisk {

public static void main(String[] args) throws IOException , AddressException, MessagingException {

  
    String hostName = null;
    String rslt_totalSpace = null ;
    String rslt_freeSpace = null ;
    String rslt_Final = "" ;
    String rslt_Hostame = "" ;
    double stat_Final = 0 ;
    String rslt_F = null ;
    
    /**
* Lecture de HostName computer
*/
  /*  try {
    	final InetAddress addr = InetAddress.getLocalHost();
    	hostName = new String(addr.getHostName());
    } catch(final Exception e) {
    }//end try
    */
    
    
    try {
    	final InetAddress addr = InetAddress.getByName("DT-ITI-MON04");
    	//hostName = new String(addr.getHostAddress());//pour laisser que l'ip
    	hostName = new String(addr.getHostName()); // pour laisser que le nom
    	//hostName = new String(addr.getByName("dt-iti"));
    } catch(final Exception e) {
    }//end try
    
    System.out.println("Hostname: " + hostName);
    System.out.println("----------------------");

    List <File>files = Arrays.asList(File.listRoots());
   
    for (File f1 : files) {
    	String description = FileSystemView.getFileSystemView().getSystemTypeDescription(f1);      
/**
* Programme Free space
*/
if (f1.exists()) {

if(description.equals("Local Disk")){

/**
* Afficher taille au format xx Ko ou xx Mo ou Go
*/
//capacité de la partition
long totalSpace = f1.getTotalSpace();
        long size = (long) ( totalSpace/ (1024)) + 1;
        if (size > 1024 ) {			        		
        	rslt_totalSpace = (size / (1024*1024)) + " Go";			        	
        } 			        	
        else if (size > 1024) {
        		rslt_totalSpace = (size / (1024)) + " Mo";			        	
        }			        	
        else {			        	
        	rslt_totalSpace = size + " ko";			        	
        }

        //Espace disponible			        
        	long freeSpace = f1.getFreeSpace();
        	long size1 = (long) ( freeSpace/ (1024)) + 1;				
        		if (size1 > 1024 ) {					
        			rslt_freeSpace = (size1 / (1024*1024)) + " Go";		        
        		} 		        
        		else if (size1 > 1024) {		        	
        			rslt_freeSpace = (size1 / (1024)) + " Mo";		        
        		}		        
        		else {		        	
        			rslt_freeSpace = size1 + " ko";		        
        		}
        		
        		//calcule Statistique disque dur
        		
        		stat_Final = Double.valueOf(rslt_freeSpace.replaceAll(" Go", ""))/Double.valueOf(rslt_totalSpace.replaceAll(" Go", ""))*100;

        		/**
* Conversion 2 chiffres après la virgule
*/
        		DecimalFormat df = new DecimalFormat("########.00"); 
        		rslt_F = (df.format(stat_Final));
        		
        			        		
//debug
        System.out.println("Propriété du fichier        : " + f1);
        System.out.println("Taille de l'espace libre    : " + rslt_freeSpace);
        System.out.println("Taille de l'espace du disque: " + rslt_totalSpace);
        System.out.println("Stat de l'espace du disque  : " + rslt_F+ " " + "%" + "\n");
}		
}	
    }
}
}



Hicham

10 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
8 août 2012 à 11:13
Salut,

A vrai dire, je ne comprend pas comment tu essayes d'accéder aux autres postes. Tu peux le faire en utilisant le chemin UNC sous windows : \\hosname\...

ou /net/hostame/... sous unix, linux.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
8 août 2012 à 11:14
Précision important, il faut pour cela que ton dossier soit partagé et que tu ais les droits dessus.
0
Je peux y accéder facilement via mon PC car tout les PC sont connectés sur le même serveur.

lorsque je tapes la fonction ci-dessous :

final InetAddress addr = InetAddress.getByName("DT-ITI-MON04");

il voit bien la machine et me donner soit l'adresse IP soit le Hostname.

je pense que c'est un problème concernant cette routine ci-dessous :

List <File>files = Arrays.asList(File.listRoots());
  for (File f1 : files) {
    	String description = FileSystemView.getFileSystemView().getSystemTypeDescription(f1);  


Hicham
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
8 août 2012 à 14:28

List the available filesystem roots.
A particular Java platform may support zero or more hierarchically-organized file systems. Each file system has a root directory from which all other files in that file system can be reached. Windows platforms, for example, have a root directory for each active drive; UNIX platforms have a single root directory, namely "/". The set of available filesystem roots is affected by various system-level operations such the insertion or ejection of removable media and the disconnecting or unmounting of physical or virtual disk drives.

This method returns an array of File objects that denote the root directories of the available filesystem roots. It is guaranteed that the canonical pathname of any file physically present on the local machine will begin with one of the roots returned by this method.

The canonical pathname of a file that resides on some other machine and is accessed via a remote-filesystem protocol such as SMB or NFS may or may not begin with one of the roots returned by this method. If the pathname of a remote file is syntactically indistinguishable from the pathname of a local file then it will begin with one of the roots returned by this method. Thus, for example, File objects denoting the root directories of the mapped network drives of a Windows platform will be returned by this method, while File objects containing UNC pathnames will not be returned by this method.

Unlike most methods in this class, this method does not throw security exceptions. If a security manager exists and its SecurityManager.checkRead(java.lang.String) method denies read access to a particular root directory, then that directory will not appear in the result.


Si j'ai bien tout compris pour que tu puisses accéder à un file system, il faut soit qu'il soit monté soit qu'il soit accessible sur le réseau via UNC sous Windows. Est ce que tu as essayer d'accéder manuellement aux files system ? Est ce que tu es certain d'avoir les bons droits ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
si je veux accéder au disque dur de l'autre PC via le mien.

j'ai exécuté \\dt-iti-mon02\d$

par contre si je fais \\dt-iti-mon02 ==> il me donne accès au fichier partagé mais il y en a pas juste l'imprimante.

tu penses que c'est ça le problème.

en VB mon pote l' a fait comme ça mais en java rien du tout grrrrrr.

sur un autre forum voilà ce que je dis le type :

Réponse simple: c'est impossible à faire, cette information n'est pas exportée
Réponse compliquée: voir quels protocoles supportent ces machines (cifs, ftp, ssh, ...) et en fonction de ça déterminer comment tu va extrapoler ces informations. Par exemple, avec du cifs, tu pourrais utiliser jcifs pour te connecter aux partages de ces machines et les lister.


Hicham
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 août 2012 à 08:47
Pour les protocoles, c'est hors sujet, java est un langage de haut niveau les protocoles sont encapsulés.

Les accès UNC à des partitions C$, D$, c'est toujours un peu foireux c'est une partition non montée et non partagée, je pense que c'est ce qui cause le dysfonctionnement. Le mieux est de créer un dossier partagé à la racine de la partition.

Après, tu n'as pas forcément la main sur cette arborescence.

Tu peux revenir à des méthodes plus basiques en lancant des commandes systèmes avec Runitme.exec. Mais c'est un boulot de fou pour récupérer le résultat d'un dir et l’interpréter. Si tu trouves une autre solution, c'est pas plus mal.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 août 2012 à 10:20
Salut,

Dans ton cas, sachant qu'elle ne liste pas les partoches du distant, la ligne ci-dessous n'a aucun sens:

List <File>files = Arrays.asList(File.listRoots());



-----

"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
Merci pour vos réponses.

je sais que c'est pas la bonne.

je cherche comment faire.

bien à toi

Hicham
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 août 2012 à 11:13
Salut,

pour Windows la solution la plus simple (sans savoir si depuis le temps ils ont ajoutés ça au jdk/api) serait de passer par un appel système ou jni/jna pour utiliser WMI (normalement ça devrait faire l'affaire)... pour les machines unix disposant d'un serveur SSH/FTP le problème ne se pose pas(trop basique à récupérer avec ça)...

Mais globalement si ton device n'est pas "monté" (physiquement ou virtuellement) et/ou que tu ne passes pas par une commande dispo via un protocole (ex commande ftp, commande via ssh ; pour ne citer qu'eux ; etc...), tu vas droit dans l'impasse.


-----

"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
J'ai réussi à le faire en powershell via le net,

si quelqu'un veut le script dites le moi :

en fait j'ai réussi à avoir l'info via java avec cette routine ci-dessous :
System.out.println(new File("\\\\DT-ITI-MON04\\d$").getFreeSpace());



il m'affiche : 167968416256 ou 156 Go

maintenant j'essaye encore un peu de voir comme l’intégrer.

voilà mon idée : essayer de lire les disques C:, D: et puis de l'intégrer via une variable disque [] = C et D


Hicham
0
Rejoignez-nous