JFileChooser et client/server

guit38 Messages postés 4 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 8 juin 2005 - 16 août 2004 à 17:17
khalid_karrat Messages postés 2 Date d'inscription samedi 26 mai 2007 Statut Membre Dernière intervention 19 août 2008 - 19 août 2008 à 23:12
bonjour

J'ai une application client/serveur, et je souhaite voir et sélectionner à partir du programme client des fichiers situés sur un ordinateur distant (où tourne l'application serveur).

Pour cela j'ai utilisé un JFileChooser. J'ai également surchargé les classes File et FileSystemView. Mes surcharges utilisent RMI pour exécuter chacune des méthodes (de File et de FileSystemView) sur le serveur distant.
ça marche et je peux choisir les fichiers distants et en sélectionner un.

Le problème c'est que sur une platform windows, je ne peux pas atteindre "poste de travail". Si je choisit de mettre le dossier courant de mon JFileChooser sur le disque C:/ de mon serveur, je ne peux pas choisir un fichier situé sur un autre disque puisque je ne peux pas remonter au dela de la racine C:/ pour atteindre "poste de travail".

Si quelqu'un pouvait m'aider, parce que là je lutte!

13 réponses

gmi19oj19 Messages postés 545 Date d'inscription lundi 10 mai 2004 Statut Membre Dernière intervention 28 septembre 2011 2
16 août 2004 à 20:02
Utilise ton application sous linux :big)
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
17 août 2004 à 00:21
euh, j'ai une solution toute conne :
tu changes le LookAndFeel de ton programme et tu utilises celui du système :

try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {
e.printStackTrace();
}

et là, magie, hop :big) , dans ton JFileChooser, tu as accès au poste de travail, aux favoris réseaux...

A+

Dobeliou
[Il ne faut jamais jouer à saute-mouton avec une licorne]
0
guit38 Messages postés 4 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 8 juin 2005
17 août 2004 à 10:21
le changement de lookAndFeel n'a rien donné (merci quand même ;). De plus si je tire mes surcharges (de File et FileSystemView), je fais donc pointer mon JFileChooser sur l'ordinateur client, le lookAndFeel n'empêche pas de remonter au poste de travail.
0
wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
17 août 2004 à 10:39
c'est pas un probleme de File.listRoots
0

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

Posez votre question
guit38 Messages postés 4 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 8 juin 2005
17 août 2004 à 15:26
la méthode listRoots de la classe File est static, je ne l'ai donc pas surchargée. cependant elle n'est pas utilisée si je fait tournée mon programme client en debug. Mais ça doit être une histoire de ce genre. En fait la méthode utilisée c'est getRoots dans FileSystemView. Cette méthode retourne "Desktop" sur une platform windows.
je pense que le problème vient de la méthode getParentFile() de la classe File mais qui est surchargée dans la classe sun.awt.shell.ShellFolder ou Win32ShellFolder. D'ailleurs je n'ai ne sait pas où trouver les sources de ces classes, elles ne sont pas dans l'API.
0
wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
17 août 2004 à 16:39
bref appelle java.io.FileSystemView.getRoots() dans le getRoots de ta classe et ajoute tes racines.
0
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
12 févr. 2005 à 01:41
Bonsoir grands chefs !

Je cherche à lister des dossiers partagés sur ordinateur distants (en réseau local LAN), et je sens bien que vous tous... cherchez à cacher quelque-chose à ce sujet dans ce post !
Actuellement, mon (tout petit) code se contente bêtement de repertorier les noms et IP des machines présentes dans mon masque réseau, et j'aimerais désormais pouvoir connaître les dossiers (et fichiers) partagés sur ces machines. Or, avec :

File[] drive;
drive = File.listRoots();
for (int i = 0; i < drive.length; i++) { System.out.println(drive[i].toString()); }

On obtient les disques en présence sur notre propre machine 127.0.0.1 (localHost ou 192.168.0.1 sur mon réseau, en l'occurence) :
Sauriez-vous comment faire pour spécifier que cette recherche se fasse sur, par exemple : 192.168.0.(1<X<255) (une machine distante de mon réseau) ?
J'imagine que cela provoquerait des exceptions en ce qui concerne ce qui n'est pas partagé, mais peut-être est-ce possible malgré tout ?
J'ai bien essayé de me renseigner à propos des class RMI, mais je suis perdu entre les "synchronized" et autres "sockets" qui semblent s'éloigner de mon but, avec notamment la nécéssité de retrouver java sur les 2 machines client/serveur...
A propos des class "FileSystemView" dont vous parlez :
Chez moi, je ne trouve que "java.io.fileSystem" et "java.io.win32FileSystem" qui, de plus, ne sont pas "public" et que je ne peux donc pas appeller depuis mon code pour essayer votre fameux "getRoots".
Je crains de toute façon de ne pas avoir le niveau, si elles sont accessibles grçace à un tour de passe-passe, pour aller les implémenter avec les non-moins menaçantes "RMI" !
Au risque de passer pour un flegmard, n'y a-t'il pas plus simple ?
Serait-ce abuser, surtout en réponse à une demande d'aide, d'en demander à mon tour ?
J'ai cru comprendre que votre soucis venait se situer à un niveau graphique lors de la représentation des ordinateurs et des disques, mais que vous pouviez d'ores et déjà accèder aux fichiers; votre aide me serait donc trés précieuse, merci.
0
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
20 mai 2005 à 16:12
Bonjour, Bonsoir...
Quelques mois de méditation et quelques caractères plus gros que des maisons plus tard, j'ai eu l'opportunité de tomber sur un code qui permettait d'avoir l'interface d'un explorateur de fichiers en JAVA, déjà tout fait, et qui comprends notamment le fameux Favoris Réseau de Windows et donc, les racines des partages que je cherchais ci-dessus. Le but essentiel de mon application était de trouver ces partages plus vite que ne le fait Windows dans son propre explorateur : Dans un premier temps, donc, j'avais utilisé le résultat de la commande "netview.exe" pour y parvenir :

//**********************************************************************************
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;
import util.Vector;
//(...)
Vector SourceSharedFolders = new Vector();
try
{
Process process = Runtime.getRuntime().exec("net view \\\" + PCname );
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s=reader.readLine();
do
{
if ((s != null)&&( s.length() > 12))
{
for (int i = 0; i < (s.length() - 11); i++)
{
if ( (s.substring(i, i + 12)).compareTo(" Disque") == 0)
{
for (int j=i+13; j <s.length(); j++) { if (s.charAt(j)!=' ') break; }
s=s.substring(0,i);
for (int k=0; k < i; k++)
{ // Il va falloir purger certains caractères spéciaux mal convertis entre dos-windows et java
if ( s.charAt(k)=='‚' ) s = s.substring(0,k) + 'é' + s.substring(k+1,i);
else if ( s.charAt(k)=='š' ) s = s.substring(0,k) + 'è' + s.substring(k+1,i);
else if ( s.charAt(k)=='‡' ) s = s.substring(0,k) + 'ç' + s.substring(k+1,i);
else if ( s.charAt(k)=='…' ) s = s.substring(0,k) + 'à' + s.substring(k+1,i);
else if ( s.charAt(k)=='ù' ) s = s.substring(0,k) + '¨' + s.substring(k+1,i);
else if ( s.charAt(k)=='œ' ) s = s.substring(0,k) + '£' + s.substring(k+1,i);
else if ( s.charAt(k)=='Ï' ) s = s.substring(0,k) + '¤' + s.substring(k+1,i);
else if ( s.charAt(k)=='—' ) s = s.substring(0,k) + 'ù' + s.substring(k+1,i);
else if ( s.charAt(k)=='æ' ) s = s.substring(0,k) + 'µ' + s.substring(k+1,i);
else if ( s.charAt(k)=='õ' ) s = s.substring(0,k) + '§' + s.substring(k+1,i);
} // Une exception sera levée en cas d'un autre caractère spécial non pris en compte ici...
SourceSharedFolders.addElement(s);
System.out.println(s);
}
}
}
}
while (s != null);
reader = null;
}
catch (IOException ioE)
{
ioE.printStackTrace();
System.out.println("ERRREUR durant l'éxécution de la commande " Net View " de windows.");
}
//**********************************************************************************

Cela fonctionne nickel, mais vous en conviendrez, cela ressemble à un bricolage dangereux avec du scotch !!! Et de plus, JAVA étant multiplateforme, on pouvait regretter l'utilisation d'un code natif pour parvenir àca résultat... Donc j'ai essayé avec le code suivant, de récupérer les String/URL correspondant aux dossiers racines des partages de chaque machine ( "PCname" corresponds au nom du PC surlequel on veut faire la recherche, et s'obtient avec un PING sur IP :
namePC = InetAddress.getByName(IP).getHostName().toString();
if (!namePC.startsWith(ip.toString())) { // PING OK, le PC à cette IP a un nom et donc existe }
) Bref, voici une alternative à NetView.exe pour les partages de fichiers en JAVA :

//**********************************************************************************
import javax.swing.filechooser.FileSystemView;
//(...)
Vector SourceSharedFolders = new Vector();
File[] rootsOS = FileSystemView.getFileSystemView().getRoots();
rootsOS = rootsOS[0].listFiles();
for (int lfr = 0; lfr < rootsOS.length; lfr++)
{ // Sous windows, donc , l'un des premiers ROOTS présent sur le Bureau est "Favoris réseau" :
if (rootsOS[lfr].toString().compareTo("Favoris réseau") == 0)
{
rootsOS = rootsOS[lfr].listFiles();
for (int ltr = 0; ltr < rootsOS.length; ltr++)
{ // Dans "Favoris réseau", on trouve des raccourcis et notamment "Tout le réseau"
if (rootsOS[ltr].toString().compareTo("Tout le réseau") == 0)
{ //System.out.println(rootsOS[ltr] + " OK ! Recherche du réseau MS Windows... ");
rootsOS = rootsOS[ltr].listFiles();
for (int lrW = 0; lrW < rootsOS.length; lrW++)
{ // Dans "Tout le réseau", on trouve des raccourcis et notamment "Réseau Microsoft Windows"
if (rootsOS[lrW].toString().compareTo("Réseau Microsoft Windows") == 0)
{
rootsOS = rootsOS[lrW].listFiles();
for (int lD = 0; lD < rootsOS.length; lD++)
{ // Dans "Réseau Microsoft Windows", on on cherche dans chaque Domaine,
File[] rootsDOM = rootsOS[lD].listFiles();
for (int lh = 0; lh < rootsDOM.length; lh++)
{ // Dans chaque domaine, on va chercher PCName
if (rootsDOM[lh].toString().length() < PCname.length())return;
if (rootsDOM[lh].toString().substring( (rootsDOM[lh].
toString().length() - 1 - PCname.length()),
(rootsDOM[lh].toString().length() - 1)).toUpperCase().
compareTo(PCname) == 0)
{ // En cas de succès, on continue la recherche au cas où plusieurs PC présenteraient le même nom dans des Domaines différents.
rootsDOM = rootsDOM[lh].listFiles();
if (rootsDOM.length > 0) {
for (int ls = 0; ls < rootsDOM.length; ls++) {
SourceSharedFolders.addElement(rootsDOM[ls].
toString());
//System.out.println(rootsDOM[ls].toString());
}
}
else { System.out.print(" Aucun partage trouvé pour " + PCname); }
}
}
}
break; // Fin d'étude des domaines : Pas besoin de voir pour le reste...
}
}
}
}
}
}
//**********************************************************************************

Mais là encore, le résultat ressemble à un vilain bricolage de IF imbriqués, et je ne suis pas sûr, qui plus est, que le résultat soit plus performant que dans l'explorateur de windows ( Je n'ai pas encore eu l'opportunité de l'essayer dans une grande LAN de 300 personnes... ) Si le "javax.swing.filechooser.FileSystemView" va chercher ce qu'il y a sur le réseau dans l'Explorateur Windows au lieu d'interroger à sa façon l'API de base qui doit servir aussi à ce dernier, le résultat ne sera alors pas intéressant ( NetView.exe est d'ores et déjà, en effet, plus performant que l'Explorateur Windows, pour cela )
Pour ceux que cela intéresse, voici le code de base de l'interface d'un explorateur de fichiers JAVA avec filechooser ( Il doit s'agir de la façon d'implémenter ce dernier qui doit répondre à l'attente originale de ce POST. Manque ce qui concerne les parties à cacher et celles à montrer, si j'ai bien compris... Mais vu le grand âge du POST en question et l'absence de réponse, je crois que ce sera amplement suffisant pour le moment ) Je ne sais plus du tout où j'ai trouvé le code suivant qui n'est pas de moi, mais il est (!Vive!)GNUTELLA, donc vous pouvez y aller !!!

//**********************************************************************************
import java.awt.*;
import java.io.File;
import java.io.FileFilter;
import java.util.Comparator;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.*;


public class jfilechooser extends JPanel
{
private static JFrame mf;
private JTree mTree;
private DefaultTreeModel mModel;
private JList mFileView;


public static void main(String[] args)
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception err)
{
err.printStackTrace();
}
mf=new JFrame("File System Icon Bug");
mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mf.setBounds(200, 20, 500, 400);
mf.getContentPane().add(new jfilechooser());
mf.show();
}


jfilechooser()
{
super(new BorderLayout());
File[] roots=FileSystemView.getFileSystemView().getRoots();
FileRow root=new FileRow(roots);
mModel=new DefaultTreeModel(root);
mTree=new JTree(mModel);
mTree.setEditable(false);
mTree.setRootVisible(false);
mTree.setCellRenderer(new FileTreeRenderer());
mTree.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scr=new JScrollPane(mTree);
JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
split.setLeftComponent(scr);


mFileView=new JList();
JScrollPane lstScr=new JScrollPane(mFileView);
split.setRightComponent(lstScr);
TreeSelectionListener tEar=new TreeSelectionListener()
{
public void valueChanged(TreeSelectionEvent e)
{
FileRow fr=(FileRow) e.getNewLeadSelectionPath().getLastPathComponent();
File[] contents=fr.getFile().listFiles();
mFileView.setListData(contents);
}
};
mTree.addTreeSelectionListener(tEar);
mFileView.setCellRenderer(new FileListRenderer());
add(split, BorderLayout.CENTER);
}


private static boolean isDirectory(File fl)
{
FileSystemView fsv=FileSystemView.getFileSystemView();
if(fl.isDirectory())
return fsv.isTraversable(fl).booleanValue();


return fsv.isComputerNode(fl) || fsv.isDrive(fl) || fsv.isFileSystemRoot(fl);
}


private class FileRow
implements
FileFilter,
Comparator,
TreeNode
{
private File mDir;
private String mName;
private FileRow[] mChildren;
private FileRow mParent;


FileRow(File fl, FileRow parent)
{
mDir=fl;
mName=fl.getName();
mParent=parent;
if(mName.length()==0) // file roots have no name
mName=mDir.toString();
}


FileRow(File[] roots)
{
mName="Root";
mChildren=new FileRow[roots.length];
makeChildren(roots);
}


public int getChildCount()
{
if(mChildren==null)
makeChildrenFromDir();
return mChildren.length;
}


public TreeNode getChildAt(int index)
{
if(mChildren==null)
makeChildrenFromDir();
return mChildren[index];
}


private File getFile()
{
return mDir;
}


/**
* Workaround to bug 4701462
*/
private File[] filterFiles(File mDir, FileFilter fltr)
{
File[] children=mDir.listFiles();
List passed=new ArrayList();
for(int ii=0; ii<children.length; ++ii)
if(fltr.accept(children[ii]))
passed.add(children[ii]);
return (File[]) passed.toArray(new File[0]);
}


private void makeChildrenFromDir()
{
// We don't call listFiles(FileFilter), due to bug 4701462
// File[] kids = mDir.listFiles(this);
File[] kids=filterFiles(mDir, this);
if(kids!=null)
{
Arrays.sort(kids, this);
mChildren=new FileRow[kids.length];
makeChildren(kids);
}
else // this happens sometimes, like when the volume doesn't exist (a:)
mChildren=new FileRow[0];
}


private void makeChildren(File[] kids)
{
for(int ii=0; ii<kids.length; ++ii)
mChildren[ii]=new FileRow(kids[ii], this);
}


public boolean accept(File fl)
{
return isDirectory(fl);
}


public int compare(Object o1, Object o2)
{
return ((File) o1).compareTo((File) o2);
}


public String toString()
{
return mName;
}


public TreeNode getParent()
{
return mParent;
}


public int getIndex(TreeNode node)
{
for(int ii=0; ii<mChildren.length; ++ii)
if(mChildren[ii]==node)
return ii;
return -1;
}


public boolean getAllowsChildren()
{
return true;
}


public boolean isLeaf()
{
return false;
}


public Enumeration children()
{
Enumeration enum=new Enumeration()
{
int ii=0;


public boolean hasMoreElements()
{
return ii<mChildren.length;
}


public Object nextElement()
{
return mChildren[ii++];
}
};
return enum;
}
}


private class FileListRenderer extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
Component cmp=super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Icon sysIcon=FileSystemView.getFileSystemView().getSystemIcon((File) value);
((JLabel) cmp).setIcon(sysIcon);
return cmp;
}
}


private class FileTreeRenderer extends DefaultTreeCellRenderer
{
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel,
boolean expanded,
boolean leaf, int row,
boolean hasFocus)
{
File fl=((FileRow) value).getFile();
String name=FileSystemView.getFileSystemView().getSystemDisplayName(fl);
Component cmp=super.getTreeCellRendererComponent(tree, name, sel, expanded, leaf, row, hasFocus);
JLabel jc=(JLabel) cmp;
Icon fileIcon=FileSystemView.getFileSystemView().getSystemIcon(fl);
jc.setIcon(fileIcon);
return jc;
}
}
}
0
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
20 mai 2005 à 16:25
Au passage, il semblerait que beaucoup de fonctions du genre, présentes en C++ manquent à l'appel avec JAVA... Impossible en effet, avec ce dernier, d'obtenir par exemple le sous-masque réseau ( SubNet Mask ) autrement qu'en passant par "IPCONFIG.EXE"/Windows ou "IFconfig"/ UNIX ou bien en faisant une batterie de tests hyper-gourmands en ressources !!!
Pour un langage connu pour ses facilités réseaux (Sockets), de telles absences font vraiment tâche et quelues recherches sur le NET montrent vite ces limites : Dômmage.
Si je me trompe, ou si la chose évolue dans le bon sens, je vous en pire : Tenez-nous au courant !
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
20 mai 2005 à 17:57
Merci pour ta réponse :)



mais je me demande si ton message ne mériterait pas un nouveau post, car là, il est un peu perdu dans les méandres de ce forum

(et il ne va pas avoir beaucoup de lecteurs...)


Dobel
[Une fois rien, c'est rien; deux fois rien,
ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà
s'acheter quelque chose, et pour pas cher]
0
pecsdeouf Messages postés 1 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 20 mai 2005
20 mai 2005 à 18:35
Bonjour à tous,
J'ais un soucis lorsque, j'execute une requete Mysql avec la methode suivante en java:
requete = "SELECT * FROM frere where nom like " +recupR+";";
resultats = stmt.executeQuery(requete);

La valeur de recupR = "TAHIR".
lors de l'execution cette erreur se produit:
SQLStateException: S0022
Description: Unknown column 'Tahir' in 'where clause'
code erreur: 1054.

Mais lorque j'integre la Chaine 'TAHIR' directement ds la requete sans passer par la varibla de String (recupR), la requete est executeé correctement!!!
Je me demande, si la syntaxe est correcte?
0
desastreux Messages postés 50 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 5 août 2009
22 mai 2005 à 22:48
Damned !!!

Du SQL dans un post pour lequel j'ai écris ! Est-ce la blague de mauvais gout de quelqu'un qui connait mes réticences à ce verbiage ?!?!? Non, parce qu'il fallait le faire, quand même de venir poster cela ici ! Je veux bien admettre que ma propre réponse creuse beaucoup de directions annexes au sujet du TOPIC, bien qu'elle le recoupe tout de même en ce qu'elle permets de mieux le comprendre, pour ceux, qui comme moi ne connaissaient pas FileSystemView et qui sont autant intérréssés par le JFileChooser que par le côté Réseau de ce dernier.

Bref, vu la demande en explorateurs de fichiers JAVA, cela aurait en effet probablement mérité un TOPIC à part entière, mais vive les jeux de pistes (suivez le guide !) puisque j'ai linké ma réponse ci-dessus dans 2 autres topics recoupant respectivement les sujets :

http://www.javafr.com/forum.v2.aspx?ID=136226
( A propos des broadcasts LAN en JAVA )

http://www.javafr.com/forum.v2.aspx?ID=140129
( A propos des explorateurs de fichiers JAVA )

Le moteur de recherche du site aidant, et la coopération des codeurs allant bon train, ceux qui cherchent vraiment devraient trouver leur bonheur : Au besoin, ils feront des requêtes SQL !!! :))
0
khalid_karrat Messages postés 2 Date d'inscription samedi 26 mai 2007 Statut Membre Dernière intervention 19 août 2008
19 août 2008 à 23:12
Bonsoir,
j'ai un petit problème concernant l'utilisation de la class FilesystemView pour voir et sélectionner des fichiers situés sur un serveur ftp avec JFileChooser, je me demande si tu peux m'aider puisque t'as déja fais ça.

merci d'avance  
0
Rejoignez-nous