2009-07-03 2 views
47

Ich denke, das nur auf einer englischsprachige Windows-Installation funktionieren:Wie den Desktop-Pfad in Java erhalten

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

Wie kann ich diese Arbeit für nicht englisches Windows machen?

Antwort

3

scheint nicht so einfach ...

Aber Sie könnten versuchen, eine anwser gerade den Code einiger Open-Source-Projekte zu finden, zum Beispiel auf Koders. Ich denke, dass alle Lösungen dazu führen, den HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop Pfad in der Windows-Registrierung zu überprüfen. Und wahrscheinlich sind Windows-spezifisch.

Wenn Sie eine allgemeinere Lösung benötigen, würde ich versuchen, eine Open-Source-Anwendung zu finden, von der Sie wissen, dass sie auf verschiedenen Plattformen ordnungsgemäß funktioniert, und einige Symbole auf dem Desktop des Benutzers platziert.

8

Ich denke, dies ist die gleiche Frage ... aber ich bin mir nicht sicher !:

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

es lesen würde ich diese Lösung erwartet, dass die user.home zurückzukehren, aber anscheinend nicht, und Der Link in der Antwort gibt das zurück. Habe es nicht selbst ausprobiert.

Ich denke, mit JFileChooser wird die Lösung eine JVM ohne Kopf erfordern, aber Sie laufen wahrscheinlich eine von ihnen.

+4

Der oben genannte Link gibt die richtige Antwort. 'File home = FileSystemView.getFileSystemView(). GetHomeDirectory();' und dann, wenn Sie es als String 'home brauchen.getAbsolutePath(); ' –

6

Dies ist nur für Windows. Starten Sie REG.EXE und erfassen ihre Ausgabe:

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

oder Sie können JNA verwenden (complete example here)

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

Die Verwendung von JNA ist viel besser als das Aufrufen eines Prozesses und das Analysieren des Ergebnisses. – 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

Dies würde nur die englische Version zurückgeben, was das OP nicht möchte. – asteri

+0

Tun Sie das nicht. Wenn der Benutzer den Desktop verschoben hat, funktioniert das nicht! Wenn Sie einen Solid State C: -Laufwerk haben, ist es üblich, den Desktop auf ein anderes Laufwerk zu verschieben. Dies stoppt viele Schreibvorgänge auf der SSD (Lesevorgänge reduzieren nicht die Lebensdauer, schreibt nicht) und es bedeutet, dass Sie ein kleines Laufwerk C: und ein großes normales haben können. –

27

Ich benutze eine Französisch-Version von Windows und mit ihm die Anweisung:

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

funktioniert gut für mich.

+2

Tun Sie das nicht. Wenn der Benutzer den Desktop verschoben hat, funktioniert das nicht! Wenn Sie einen Solid State C: -Laufwerk haben, ist es üblich, den Desktop auf ein anderes Laufwerk zu verschieben. Dies stoppt viele Schreibvorgänge auf der SSD (Lesevorgänge reduzieren nicht die Lebensdauer, schreibt nicht) und es bedeutet, dass Sie ein kleines Laufwerk C: und ein großes normales haben können. –

-5

Die einfachste Lösung ist, den Computernamen herauszufinden, da dieser Name nur eine Variable ist, die sich im Pfad zum Desktop-Ordner ändert. Wenn Sie das also finden können, haben Sie den Pfad zum Desktop gefunden. Der folgende Code sollte den Trick - es tat für mich :)

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

gibt es 2 Dinge.

  1. Sie verwenden den falschen Schrägstrich. Für Windows ist es \ nicht /.
  2. Ich verwende RandomAccesFile und File, um Ordner und Ordner zu verwalten, und es erfordert doppelten Schrägstrich (\\), um den Namen des Ordners zu trennen.
+1

Viele Java-Klassen akzeptieren/als Trennzeichen. Dies ist absolut gültig: Datei f = neue Datei ("S: /folder/file.txt"); –

-4

Ihr Schrägstrich ist nicht korrekt. Du solltest es so benutzen.

 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

Bin ich mir nicht sicher, müssen wir so weit gehen? – Phani

+0

Es könnte nicht nützlich sein? – mauretto

+0

Bin nicht persönlich Fan von Mixing Swing mit Core Java. Also, ich habe gesucht, wenn Sie es zu etwas mehr Core-Java ändern können. – Phani