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

时间:2010-07-15 17:58:05

标签: java macos filesystems

我知道。异端。但我陷入困境。我有很多使用绝对路径名的配置文件,这会在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!");
        }
    }
}

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

更新:感谢所有人的反馈。现在很明显,我的问题应该更清楚了。

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

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

7 个答案:

答案 0 :(得分:3)

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

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

只需在根目录Q:/本身创建名为/的{​​{3}}。

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

您可能需要使用sudo。然后,在您的计划开始时,只需chdir/

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

$ /Developer/Tools/SetFile -P -a V Q:
$ /Developer/Tools/SetFile -P -a V S:

设置文件的不可见的查找位。

答案 1 :(得分:3)

简答:没有 答案很长:对于Java,您应该使用System.getProperties(XXX)。 然后,您可以根据os.name中的内容加载属性文件或配置 备用解决方案只需在读取非Windows计算机上的现有配置文件时删除S:,并将其替换为相应的内容。
意见:就个人而言,我会咬紧牙关,现在就处理技术债务,在构建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

答案 2 :(得分:2)

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

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

但如果你坚持......你只需要检测操作系统版本,如果不是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:
}

你明白了

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

这是我最终做的事情:

我下载了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中查找文件,这很好,因为它只能跟随符号链接。

是的,这很难看。但它完成了今天的工作。