Получить путь с 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
Другие вопросы по тегам