Получить путь с ip сервера вместо буквы
Я пишу приложение на Java, которое читает все пути каталогов и файлов. Это уже работает. Для переноса этих файлов мне нужен абсолютный путь, а именно IP-адрес сервера вместо буквы (в системе Windows).
Я пробовал следующие методы, найденные в классе файла:
System.out.println(file.getCanonicalPath());
System.out.println(file.getAbsolutePath());
Оба метода выводят точный путь Windows вместо IP-адреса сервера, где я читаю все пути и записываю их в текстовый файл.
2 ответа
Как вы знаете, Java является переносимым, чтобы позволить вам писать код, который работает в нескольких операционных системах. Когда вы вызываете любой из этих методов, Java спрашивает базовую операционную систему, каков путь для этого файла, и возвращает то, что вы видите. На компьютере с Windows это будет путь, включая букву диска, если это подключенный (или локальный) диск. Иногда вы можете получить UNC-путь, который включает имя сервера и общий ресурс. Для других операционных систем это поведение будет немного другим, потому что он вернет путь в том виде, в котором его видит операционная система. Тем не менее, Java на самом деле не знает и не понимает ничего о буквах дисков или операционной системе напрямую.
Поэтому эти методы не могут делать то, что вы запрашиваете. Для Windows вы звучите так, как будто ищете UNC-путь, который по-прежнему не предоставит IP-адрес, а вместо этого даст имя сервера. Они в этом формате (и считаются абсолютными):
\\server_name\share_name\path\to\file.ext
Обычно подключенный диск преобразует \\server_name\share_name
часть пути UNC в письме. Так что имейте в виду, что письмо не обязательно напрямую сопоставляется с сервером, но с общим ресурсом на определенном сервере (или общим ресурсом Windows DFS).
Для этого вы потеряете переносимость, которую обеспечивает Java. В настоящее время единственный способ, которым я знаю, как извлечь имя сервера из сопоставленного буквенного диска, - это сделать это с помощью WMI. Есть библиотеки WMI, которые может использовать Java; некоторые используют JNI, а другие используют другие методы сценариев. WMI означает инструментарий управления Windows. Это позволяет вам выполнять SQL-подобные звонки в Windows для запроса информации о системе. В этом случае вам нужно будет проанализировать возвращаемую вам букву диска и затем выполнить вызов WMI.
Вот статья об использовании WMI для этого: Как определить, какие диски подключены к сетевым ресурсам?
Просто отметьте, что приведенная выше ссылка покажет вам, как это сделать с VBScript, но концепция та же.
Вот еще один SO вопрос об интерфейсах WMI для Java: Рекомендуемые библиотеки / инструкции по использованию WMI с Java?
После того, как вы используете WMI для получения имени хоста, на котором расположен подключенный диск, или если вам первоначально был возвращен путь UNC, и вы проанализировали имя сервера, вы можете затем вызвать следующую команду, чтобы получить IP:
InetAddress address = InetAddress.getByName("COMPUTER_NAME");
String ip = address.getHostAddress();
Важно отметить, что для использования WMI иногда требуются повышенные разрешения, поэтому просто помните об этой возможности.
Будьте готовы к тому, что это будет намного сложнее, чем вы ожидали, и много разборов строк для фактического извлечения нужных вам данных.
Вы можете использовать следующие
import java.net.InetAddress;
... <your class code>
InetAddress ip = InetAddress.getLocalHost();
// Use variable ip wherever needed