【问题标题】:File path problems in windows environmentwindows环境下文件路径问题
【发布时间】:2015-08-19 15:06:00
【问题描述】:

我有以下代码行:

"%s/ramp_adapter/user_%d/ramp_file_receipt/%d".format(new java.io.File(".").getAbsolutePath().replace("/.",""), endpointId, fileId)

如果我在窗口中打印这一行,我会得到错误的文件路径:

E:\git\project\codeAdapters\rampAdapter\./ramp_adapter/user_1001/ramp_file_receipt/3

在 unix 中,文件路径是正确的。

我知道我需要让它与 windows 兼容,所以我尝试使用FilenameUtils,但这并没有解决问题。

路径在所有环境中都应该是正确的。

【问题讨论】:

  • unix 中的E: 是什么?
  • 这看起来不对。 Windows 反斜杠和 unix 使用正斜杠。
  • @SkinnyJ - 我没有查看 unix 系统,但它运行良好。我假设并保留在我的问题中的位置在查看您的评论后似乎是错误的,因此我将其删除。
  • 您是否尝试过使用java.nio.file.Paths.get(String first, String... more) 构建路径而不是字符串替换?您将根据运行时获得正确的驱动器根目录和路径分隔符。
  • 你的端点错误./ramp_adapter/user_1001...你坚持./ 部分吗?

标签: java filepath


【解决方案1】:

使用File.getCanonicalFile() 规范生成的字符串。它转换为正确的分隔符并删除. 路径段。

String s = "E:\\git\\project\\codeAdapters\\rampAdapter\\./ramp_adapter/user_1001/ramp_file_receipt/3";
File f = new File(s).getCanonicalFile();
assertEquals("E:\\git\\project\\codeAdapters\\rampAdapter\\ramp_adapter\\user_1001\\ramp_file_receipt\\3", f.toString());

【讨论】:

    【解决方案2】:

    替换

    "%s/ramp_adapter/user_%d/ramp_file_receipt/%d"
    

    "%s" + File.separatorChar + "ramp_adapter" + File.separatorChar + "user_%d" + File.separatorChar + "ramp_file_receipt" + File.separatorChar + "%d"
    

    替换

    getAbsolutePath().replace("/.","")
    

    getAbsolutePath().replace(File.separator + ".", "")
    

    【讨论】:

    • 我可以想象通过这样的分隔符处理不同环境的完美。引用File.separatorChar - “系统相关的默认名称分隔符。该字段被初始化为包含系统属性文件值的第一个字符。分隔符。在 UNIX 系统上,该字段的值为“/”;在 Microsoft Windows 系统上,它是 '\\'。”瞧!!
    • 虽然我的回答在功能上是正确的,但我建议使用getCanonicalFile() 重写您的代码以符合 wero 的回答/建议,因为这是一个更优雅的选择。我目前对他的回答投赞成票。
    【解决方案3】:

    当前工作目录. 取决于应用程序的启动方式,即在何处启动。你可能会使用

    System.getProperty("user.dir")
    

    而不是获取绝对路径。

    可能会出现同样的问题:在Windows下点击会有问题。

    解决方案/解决方法可能是在 Windows 下有一个批处理文件。

    我倾向于在用户的主文件夹中使用依赖于应用程序的目录。用前一个句号隐藏时:

    File myAppDir = new File(System.getProperty("user.home") + "/.myappname";
    myAppDir.mkdir();
    

    【讨论】:

    • File 具有附加路径的构造函数,因此您不必进行字符串连接。因为那是一件坏事。
    • @zapl 好话;我想先打电话给mkdir(s)。也许现在我应该使用Path, Paths.get(...), Files
    【解决方案4】:

    1) 使用 System.getProperty("file.separator") 获取当前操作系统文件 分隔器。 2) new java.io.File(".").getAbsolutePath() 将返回Linux中的linux路径(/etc/uus/.)和windows中的Windows路径(例如:C:\xpto\sdfs.)

    您需要按照自己的意愿进行标准化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多