2009-07-03 5 views

risposta

3

non sembra che facile ...

Ma si potrebbe provare a trovare un'anwser navigando il codice di alcuni progetti open-source, per esempio su Koders. Immagino che tutte le soluzioni si riducano a verificare il percorso HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop nel registro di Windows. E probabilmente sono specifici per Windows.

Se è necessaria una soluzione più generale, proverei a trovare un'applicazione open source che funzioni correttamente su piattaforme diverse e inserisce alcune icone nel desktop dell'utente.

8

penso che questo sia la stessa domanda ... ma non sono sicuro !:

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

Leggendolo mi aspetterei che la soluzione per riportare l'user.home, ma a quanto pare non, e il link nella risposta commenta. Non l'ho provato da solo.

Suppongo che utilizzando JFileChooser la soluzione richiederà una JVM non headless, ma probabilmente si sta eseguendo uno di essi.

+4

Il link di cui sopra dà la risposta corretta. 'File home = FileSystemView.getFileSystemView(). GetHomeDirectory();' e quindi se ne hai bisogno come stringa 'home.getAbsolutePath(); ' –

6

Questo è solo per Windows. Avviare REG.EXE e catturare la sua uscita:

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(); 
    } 
    } 
} 

oppure è possibile utilizzare JNA (complete example here)

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

L'utilizzo di JNA è molto meglio che chiamare un processo e analizzare il risultato. – 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

Questo restituirebbe solo la versione inglese, che non è ciò che l'OP vuole. – asteri

+0

Non farlo. Se l'utente ha spostato il desktop, questo non funzionerà! Se si dispone di uno stato solido C: guidare è abbastanza comune spostare il desktop su un'unità diversa. Questo interrompe molte scritture sull'SSD (le letture non riducono la durata, le scritture lo fanno) e significa che puoi avere una piccola unità C: e una grande normale. –

27

Io uso una versione francese di Windows e con essa l'istruzione:

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

funziona bene per me.

+2

Non farlo. Se l'utente ha spostato il desktop, questo non funzionerà! Se si dispone di uno stato solido C: guidare è abbastanza comune spostare il desktop su un'unità diversa. Questo interrompe molte scritture sull'SSD (le letture non riducono la durata, le scritture lo fanno) e significa che puoi avere una piccola unità C: e una grande normale. –

-5

La soluzione più semplice è trovare il nome del computer, poiché questo nome cambia solo in modo variabile nel percorso della cartella Desktop. Quindi, se riesci a trovarlo, hai trovato il percorso per Desktop. Il seguente codice dovrebbe fare il trucco - lo ha fatto per me :)

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

ci sono 2 cose.

  1. si sta utilizzando la barra sbagliata. per Windows è \ non /.
  2. sto utilizzando RandomAccesFile e File per gestire file e cartelle e richiede una doppia barra (\\) per separare il nome delle cartelle.
+1

Un sacco di classi java accettano/come separatore. Ciò è perfettamente valido: File f = new File ("S: /folder/file.txt"); –

-4

La tua barra non è corretta. Dovresti usarlo in questo modo.

 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

Non sono sicuro che dobbiamo andare così lontano? – Phani

+0

Non potrebbe essere utile? – mauretto

+0

Personalmente non sono un fan del mixing swing con core java. Quindi, stavo cercando se è possibile cambiarlo in qualcosa di più core java. – Phani