如何让OS X识别驱动器号?

我知道。 异端。 但我陷入困境。 我有很多使用绝对路径名的配置文件,这会在OS X和Windows之间产生不兼容性。 如果我能够将OS X(我认为两者中的灵活性更灵活)识别为Q:/foo/bar/bim.properties作为有效的绝对文件名,那么它将节省我通过堆栈的工作天数跟踪和配置文件。

最后,我需要这些Java测试代码来打印“SUCCESS!” 当它运行时:

import java.io.*; class DriveLetterTest { static public void main(String... args) { File f = new File("S:"); if (f.isDirectory()) { System.out.println("SUCCESS!"); } else { System.out.println("FAIL!"); } } } 

任何人都知道如何做到这一点?

更新:感谢所有人的反馈。 现在对我来说很明显,我的问题应该更加明确。

配置文件和使用它们的代码都属于我无法更改的第三方软件包。 (好吧,我可以改变它们,但这意味着会产生持续的维护负荷,如果可能的话我想避免这种情况。)

完全同意所有对这种状况感到震惊的人。 但事实仍然是:我无法更改第三方代码,我真的想避免分配配置文件。

很可能你必须提供一个不同的java.io.File实现,它可以正确地解析文件路径,也许已经有人做过了。
真正的解决方案是将这种东西(硬编码文件路径)放在配置文件中而不是源代码中。

简答:没有
答案很长:对于Java,您应该使用System.getProperties(XXX) 。 然后,您可以根据在os.name找到的内容加载属性文件或配置。
替代解决方案只是剥离S:当您读取非Windows机器上的现有配置文件并用适当的东西替换它们时。
意见:就个人而言,我会咬紧牙关并现在处理技术债务,在构建OSX部署并完成部署时,在构建时修复所有配置文件。

 public class WhichOS { public static void main(final String[] args) { System.out.format("System.getProperty(\"os.name\") = %s\n", System.getProperty("os.name")); System.out.format("System.getProperty(\"os.arch\") = %s\n", System.getProperty("os.arch")); System.out.format("System.getProperty(\"os.version\") = %s\n", System.getProperty("os.version")); } } 

我的iMac输出是:

 System.getProperty("os.name") = Mac OS X System.getProperty("os.arch") = x86_64 System.getProperty("os.version") = 10.6.4 

老实说 ,不要在程序中硬编码绝对路径,即使对于单平台应用程序也是如此。 做正确的事。

以下是我的错误解决方案,保存以提醒自己不要重复给出错误的建议……对我感到羞耻。

只需创建一个名为Q:的符号链接 Q:只在根目录/ to /本身。

 $ cd / $ ln -s / Q: $ ln -s / S: 

您可能需要使用sudo 。 然后,在程序开始时,只需将chdir/

如果您不希望Q:S:显示在Finder中,请执行

 $ /Developer/Tools/SetFile -P -a VQ: $ /Developer/Tools/SetFile -P -a VS: 

它设置了文件的不可见到Finder位。

替换java.io.File的唯一方法是替换rt.jar中的该类。

我不建议这样做,但最好的方法是获取OpenJDK代码的bsd-port,进行必要的更改,构建它并使用您的项目重新分发二进制文件。 编写一个shell脚本来使用你自己的java二进制文件,而不是内置的。

PS。 只需更改配置文件! 练习你的正则表达式技巧,节省很多时间。

如果您不愿意为每个操作系统更改配置文件,那么它们首先适用于什么?

每个安装都应该有自己的一组配置文件并相应地使用它。

但是如果你坚持……你只需要检测操作系统版本,如果不是Windows,请忽略这封信:

一些事情:

 boolean isWindows = System.getProperty("os.name").toLowerCase() .contains("windows"); String folder = "S:"; if (isWindows && folder.matches("\\w:")) { folder = "/"; } else if (isWindows && folder.matches("\\w:.+")) { folder = folder.substring(2);// ignoring the first two letters S: } 

你明白了

刚刚测试了一些东西,并发现了一些有趣的东西:在Windows中,如果当前目录位于同一逻辑卷上(即root是相同的驱动器号),则可以在使用路径时保留驱动器号。 所以你可以修剪所有那些驱动器号和冒号,只要你没有使用不同磁盘上的项目路径,你就应该没问题。

这是我最终做的事情:

我下载了java.io包的源代码,并调整了java.io.File的代码,以查找以字母和冒号开头的路径名。 如果找到一个,它会在路径名前加上“/ Volumes /”,向System.err发出警告,然后继续正常。

我在/ Volumes下添加了符号链接到我需要映射的“驱动器”,所以我有:

  • /卷/ S:
  • /卷/ Q:

我将它放入自己的jar中,并将该jar放在此项目的类路径的前面。 这样,hack只影响我,只影响这个项目。

最终结果:java.io.File看到类似“S:/bling.properties”的路径,然后检查操作系统。 如果操作系统是OS X,它会预先添加“/ Volumes /”,并在/Volumes/S:/bling.properties中查找文件,这很好,因为它只能跟随符号链接。

是的,这很丑陋。 但它完成了今天的工作。