Как я могу заставить OS X распознавать буквы дисков? - PullRequest
3 голосов
/ 15 июля 2010

Я знаю. Ересь. Но я в затруднении. У меня есть много файлов конфигурации, которые используют абсолютные имена путей, что создает несовместимость между OS X и Windows. Если я смогу заставить OS X (которую я держу пари, что она более гибкая из двух) распознать Q: /foo/bar/bim.properties в качестве действительного абсолютного имени файла, это спасет меня дня работы с использованием трассировки стека и файлов конфигурации.

В конце концов, мне нужен этот тестовый код Java, чтобы напечатать "УСПЕХ!" когда он запускается:

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 ]

3 голосов
/ 15 июля 2010

Краткий ответ: Нет.
Длинный ответ: Для 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
3 голосов
/ 15 июля 2010

Честно говоря , не кодируйте абсолютные пути в программе даже для одноплатформенного приложения.Сделайте правильную вещь.

Следующее - мое неправильное решение, сохраненное, чтобы напомнить себе, чтобы я не повторял неправильный совет ... позор мне.

Просто создайте символическая ссылка с именем Q: только в корневом каталоге / до /.

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

Возможно, вам потребуется использовать sudo.Затем, в начале вашей программы, просто chdir до /.

Если вы не хотите, чтобы Q: и S: отображались в Finder, выполните

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

, который устанавливает бит невидимого для Finder файлов.

2 голосов
/ 15 июля 2010

Единственный способ заменить java.io.File - это заменить этот класс в rt.jar.

Я не рекомендую этого, но лучший способ сделать это - захватить bsd-порт кода OpenJDK , внесите необходимые изменения, соберите его и перераспределите двоичный файл вместе с вашим проектом.Напишите сценарий оболочки для использования вашего собственного двоичного файла Java, а не встроенного.

PS.Просто измените ваши конфигурационные файлы!Практикуйте свои навыки регулярных выражений и сэкономьте много времени.

2 голосов
/ 15 июля 2010

Если вы не желаете изменять свой файл конфигурации для каждой ОС, для чего они нужны?

Каждая установка должна иметь свой собственный набор файлов конфигурации и использовать его соответственно.

Но если вы настаиваете ... вам просто нужно определить версию ОС, а если это не 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:
}

Вы поняли

1 голос
/ 16 июля 2010

Вот что я в итоге и сделал:

Я скачал исходный код для пакета java.io и настроил код для java.io.File, чтобы искать пути, начинающиеся с буквы идвоеточиеЕсли он находит его, он добавляет «/ Volumes /» к имени пути, выдает кашель предупреждению в System.err, затем продолжает как обычно.

Я добавил символические ссылки в / Volumes для «накопителей» Iнужно сопоставить, поэтому у меня есть:

  • / Тома / S:
  • / Тома / Q:

Я положил его в свою банку, ипоместите эту банку в начало пути к классам для только для этого проекта .Таким образом, взлом влияет только на меня и только на этот проект.

Чистый результат: java.io.File видит путь типа «S: /bling.properties», а затем проверяет ОС.Если OS OS OS, она добавляет "/ Volumes /" и ищет файл в /Volumes/S:/bling.properties, что хорошо, потому что она может просто следовать символической ссылке.

ДаГадкий.Но на сегодня это сделано.

1 голос
/ 15 июля 2010

Только что протестировал и обнаружил что-то интересное: в Windows, если текущий каталог находится на том же логическом томе (т. Е. Root - это та же буква диска), вы можете не указывать букву диска при использовании пути. Таким образом, вы можете просто обрезать все эти буквы дисков и двоеточия, и все будет в порядке, если вы не используете пути к элементам на разных дисках.

1 голос
/ 15 июля 2010

Скорее всего, вам придется предоставить другую реализацию java.io.File, которая может правильно анализировать пути к файлам, возможно, кто-то уже сделал.
Реальное решение заключается в том, чтобы помещать подобные вещи (жестко заданные пути к файлам) в файлы конфигурации, а не в исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...