2009-07-03 9 views

Répondre

3

ne semble pas aussi simple que cela ...

Mais vous pouvez essayer de trouver un anwser parcourant le code de certains projets open source, par exemple au Koders. Je suppose que toutes les solutions se résument à vérifier le chemin HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop dans le registre de Windows. Et sont probablement spécifiques à Windows.

Si vous avez besoin d'une solution plus générale, j'essaierai de trouver une application open source qui fonctionne correctement sur différentes plates-formes et qui place des icônes sur le bureau de l'utilisateur.

8

Je pense que cela est la même question ... mais je ne suis pas sûr !:

In java under Windows, how do I find a redirected Desktop folder?

lecture, je me attends à cette solution pour retourner le user.home, mais apparemment pas, et le lien dans la réponse commente cela. Je n'ai pas essayé moi-même.

Je suppose qu'en utilisant JFileChooser la solution nécessitera une JVM non-headless, mais vous en exécutez probablement une.

+4

Le lien mentionné ci-dessus donne la bonne réponse. 'File home = FileSystemView.getFileSystemView(). GetHomeDirectory();' et ensuite si vous en avez besoin en tant que chaîne 'home.getAbsolutePath(); ' –

6

Ceci est uniquement pour Windows. Lancez REG.EXE et capturer sa sortie:

import java.io.*; 

public class WindowsUtils { 
    private static final String REGQUERY_UTIL = "reg query "; 
    private static final String REGSTR_TOKEN = "REG_SZ"; 
    private static final String DESKTOP_FOLDER_CMD = REGQUERY_UTIL 
    + "\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\" 
    + "Explorer\\Shell Folders\" /v DESKTOP"; 

    private WindowsUtils() {} 

    public static String getCurrentUserDesktopPath() { 
    try { 
     Process process = Runtime.getRuntime().exec(DESKTOP_FOLDER_CMD); 
     StreamReader reader = new StreamReader(process.getInputStream()); 

     reader.start(); 
     process.waitFor(); 
     reader.join(); 
     String result = reader.getResult(); 
     int p = result.indexOf(REGSTR_TOKEN); 

     if (p == -1) return null; 
     return result.substring(p + REGSTR_TOKEN.length()).trim(); 
    } 
    catch (Exception e) { 
     return null; 
    } 
    } 

    /** 
    * TEST 
    */ 
    public static void main(String[] args) { 
    System.out.println("Desktop directory : " 
     + getCurrentUserDesktopPath()); 
    } 


    static class StreamReader extends Thread { 
    private InputStream is; 
    private StringWriter sw; 

    StreamReader(InputStream is) { 
     this.is = is; 
     sw = new StringWriter(); 
    } 

    public void run() { 
     try { 
     int c; 
     while ((c = is.read()) != -1) 
      sw.write(c); 
     } 
     catch (IOException e) { ; } 
     } 

    String getResult() { 
     return sw.toString(); 
    } 
    } 
} 

ou vous pouvez utiliser la JNA (complete example here)

Shell32.INSTANCE.SHGetFolderPath(null, 
     ShlObj.CSIDL_DESKTOPDIRECTORY, null, ShlObj.SHGFP_TYPE_CURRENT, 
     pszPath); 
+1

L'utilisation de JNA est beaucoup mieux que d'appeler un processus et d'analyser le résultat. – Sebastian

-3
public class Sample { 
    public static void main(String[] args) {  
     String desktopPath =System.getProperty("user.home") + "\\"+"Desktop"; 
     String s = "\"" + desktopPath.replace("\\","\\\\") + "\\\\" +"satis" + "\""; 
     System.out.print(s); 
     File f = new File(s); 
     boolean mkdir = f.mkdir(); 
     System.out.println(mkdir); 
    } 
} 
+1

Cela ne ferait que renvoyer la version anglaise, ce qui n'est pas ce que veut l'OP. – asteri

+0

Ne faites pas ça. Si l'utilisateur a déplacé le bureau, cela ne fonctionnera pas! Si vous avez un lecteur C: à l'état solide, il est assez courant de déplacer le bureau sur un autre lecteur. Cela arrête beaucoup d'écritures sur le disque SSD (les lectures ne réduisent pas la durée de vie, les écritures) et cela signifie que vous pouvez avoir un petit disque C: et un gros disque normal. –

27

J'utilise une version française de Windows et avec lui l'instruction:

System.getProperty("user.home") + "/Desktop"; 

fonctionne très bien pour moi.

+2

Ne faites pas cela. Si l'utilisateur a déplacé le bureau, cela ne fonctionnera pas! Si vous avez un lecteur C: à l'état solide, il est assez courant de déplacer le bureau sur un autre lecteur. Cela arrête beaucoup d'écritures sur le disque SSD (les lectures ne réduisent pas la durée de vie, les écritures) et cela signifie que vous pouvez avoir un petit disque C: et un gros disque normal. –

-5

La solution la plus simple consiste à trouver le nom de la machine, car ce nom est seulement variable en changeant de chemin vers le dossier Bureau. Donc, si vous pouvez trouver ceci, vous avez trouvé le chemin vers Desktop. Le code suivant devrait faire l'affaire - il a fait pour moi :)

String machine_name = InetAddress.getLocalHost().getHostName(); 
String path_to_desktop = "C:/Documents and Settings/"+machine_name+"/Desktop/"; 
-3

il ya 2 choses.

  1. vous utilisez le mauvais slash. pour les fenêtres c'est \ pas /.
  2. J'utilise RandomAccesFile et File pour gérer les fichiers et dossiers, et il faut double barre oblique (\\) pour séparer le nom des dossiers.
+1

Beaucoup de classes Java acceptent/comme séparateur. Ceci est parfaitement valide: Fichier f = new File ("S: /folder/file.txt"); –

-4

Votre barre oblique n'est pas correcte. Vous devriez l'utiliser comme ça.

 try{ 
      String sys = System.getProperty("user.home"); 

      String fileurl = sys+ "\\Desktop\\new"; 
      File newfile = new File(fileurl); 
      newfile.mkdir(); 

      }catch(Exception ioe){ 
      // Handle the error 
       System.out.println("Error"); 
      } 
7
javax.swing.filechooser.FileSystemView.getFileSystemView().getHomeDirectory() 
+1

Je ne suis pas sûr d'avoir besoin d'aller aussi loin? – Phani

+0

Cela n'a pas pu être utile? – mauretto

+0

Je ne suis pas fan personnellement de mélanger swing avec core java. Donc, je cherchais si vous pouvez le changer pour quelque chose de plus java de base. – Phani

Questions connexes