【问题标题】:How to get the Desktop path in java如何在java中获取桌面路径
【发布时间】:2009-07-03 19:52:17
【问题描述】:

我认为这仅适用于英语 Windows 安装:

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

我怎样才能使它适用于非英语 Windows?

【问题讨论】:

    标签: java desktop


    【解决方案1】:

    我使用的是法语版本的 Windows,并附有说明:

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

    对我来说很好。

    【讨论】:

    • 不要这样做。如果用户移动了桌面,这将不起作用!如果您有固态 C: 驱动器,则将桌面移动到不同的驱动器是很常见的。这会停止对 SSD 的大量写入(读取不会缩短寿命,写入会),这意味着您可以拥有一个小的 C: 驱动器和一个大的普通驱动器。
    • 至少在 Windows 7 上,'user.home' 由 JVM 启动时的注册表值设置。如果您将桌面移动到“正常”庄园,那么使用上述方法应该“正常工作”。此外,我很确定它在设置“user.home”时实际上会查找桌面,然后沿着路径向上移动 1 个目录。
    【解决方案2】:

    我认为这是同一个问题...但我不确定!:

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

    阅读它,我希望该解决方案返回 user.home,但显然不是,并且答案 cmets 中的链接支持这一点。自己没试过。

    我想通过使用JFileChooser 解决方案将需要一个非无头 JVM,但您可能正在运行其中一个。

    【讨论】:

    • 上述链接给出了正确答案。 File home = FileSystemView.getFileSystemView().getHomeDirectory(); 然后如果你需要它作为字符串 home.getAbsolutePath();
    【解决方案3】:
    javax.swing.filechooser.FileSystemView.getFileSystemView().getHomeDirectory()
    

    【讨论】:

    • 不确定我们是否需要走这么远?
    • 没用?
    • 我个人不喜欢将 swing 与核心 java 混合使用。所以,我在看你是否可以把它改成更核心的 java。
    • 开发者选择了打包的地方:-)
    • 这在 OSX 上不起作用 - 它解析为 user.home
    【解决方案4】:

    这仅适用于 Windows。启动 REG.EXE 并捕获其输出:

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

    或者您可以使用 JNA (complete example here)

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

    【讨论】:

    • 使用 JNA 比调用进程并解析结果要好得多。
    【解决方案5】:

    好像没那么简单……

    但是你可以尝试找一个浏览器浏览一些开源项目的代码,例如在Koders。我想所有的解决方案都归结为检查 Windows 注册表中的 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop 路径。并且可能是特定于 Windows 的。

    如果您需要更通用的解决方案,我会尝试找到一个您知道在不同平台上正常工作的开源应用程序,并将一些图标放在用户的桌面上。

    【讨论】:

      【解决方案6】:

      你只是缺少"C:\\Users\\"

      String userDefPath = "C:\\Users\\" + System.getProperty("user.name") + "\\Desktop";
      

      【讨论】:

      • 这不起作用in some instances C 不是正确的驱动器。无论如何,硬编码路径通常不是一个好主意。
      • 他需要桌面位置,桌面位置总是在c盘
      • 你知道比使用路径更好吗?如果你知道,请告诉我我也需要,但我回答的方式对我来说很好。
      • 请注意,这个问题已有 12 年历史,当时可能还没有当前的 Windows 选项。此外,虽然不推荐,但您可以将 Windows 安装在 C: 以外的其他驱动器上。
      【解决方案7】:
      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);
          }
      }
      

      【讨论】:

      • 这只会返回英文版本,这不是 OP 想要的。
      • 不要这样做。如果用户移动了桌面,这将不起作用!如果您有固态 C: 驱动器,则将桌面移动到不同的驱动器是很常见的。这会停止对 SSD 的大量写入(读取不会缩短寿命,写入会),这意味着您可以拥有一个小的 C: 驱动器和一个大的普通驱动器。
      【解决方案8】:

      有两件事。

      1. 您使用了错误的斜线。对于 Windows,它是 \ 而不是 /
      2. 我使用 RandomAccesFile 和 File 来管理文件和文件夹,它需要双斜杠 (\\) 来分隔文件夹名称。

      【讨论】:

      • 很多java类都接受/作为分隔符。这是完全有效的:File f = new File("S:/folder/file.txt");
      • 自 DOS 时代以来,Windows 已接受 / 作为分隔符。你在传播错误信息。
      【解决方案9】:

      最简单的解决方案是找出机器名称,因为这个名称只是桌面文件夹路径中的变量。所以如果你能找到这个,你就找到了桌面的路径。以下代码应该可以解决问题 - 它对我有用:)

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

      【讨论】:

        猜你喜欢
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 1970-01-01
        • 2010-10-12
        • 2014-12-18
        • 1970-01-01
        相关资源
        最近更新 更多