使用服务器 ip 而不是字母获取路径

get Path with server ip instead of letter

我正在 java 中编写一个应用程序,它读取目录和文件的所有路径。这已经在工作了。要迁移这些文件,我确实需要绝对路径,即服务器 IP 而不是字母(在 Windows 系统上)。

我尝试了在文件 class 中找到的以下方法:

System.out.println(file.getCanonicalPath());
System.out.println(file.getAbsolutePath());

这两种方法都打印出确切的 windows 路径,而不是我正在读取所有路径并将它们写入 txt 文件的服务器 IP。

您可以使用以下

import java.net.InetAddress;
... <your class code>
InetAddress ip = InetAddress.getLocalHost();
// Use variable ip wherever needed

如您所知,Java 是可移植的,允许您编写在多个操作系统上运行的代码。当您调用这些方法中的任何一个时,Java 会询问底层操作系统该文件的路径是什么,并且 return 会看到您所看到的内容。在 Windows 机器上,如果它是映射(或本地)驱动器,这将是包括驱动器号的路径。有时您可能会得到一个 UNC 路径,其中包括服务器名称和共享。对于其他操作系统,此行为会略有不同,因为它将 return 该操作系统看到的路径。但是,Java实际上并不直接了解或了解有关驱动器号或操作系统的任何信息。

因此这些方法无法满足您的要求。对于 Windows 你听起来像是在寻找 UNC 路径,它仍然不会提供 IP 地址,而是服务器名称。它们采用这种格式(并被认为是绝对格式):

\server_name\share_name\path\to\file.ext

通常,映射驱动器会将 UNC 路径的 \server_name\share_name 部分转换为字母。所以要注意,字母不一定直接映射到服务器,而是映射到特定服务器上的共享(或Windows DFS共享)。

为了做到这一点,您将失去 Java 提供的可移植性。目前,我知道如何从映射盘符驱动器中检索服务器名称的唯一方法是使用 WMI。有 Java 可以使用的 WMI 库;有些使用 JNI,有些使用其他脚本方法。 WMI 代表 Windows 管理规范。这允许您对 Windows 进行类似 SQL 的调用以查询有关系统的信息。在这种情况下,您需要解析出 returned 给您的驱动器号,然后进行 WMI 调用。

这是一篇关于使用 WMI 执行此操作的文章:How Can I Determine Which Drives are Mapped to Network Shares

请注意,上面的 link 将向您展示如何使用 VBScript 来实现,但概念是相同的。

这是另一个关于 Java 的 WMI 接口的问题:Recommended libraries/howtos for using WMI with java?

一旦您使用 WMI 获取映射驱动器所在的主机名,或者如果您最初是 returned 一个 UNC 路径并解析出服务器名称,那么您可以调用以下命令获取IP:

InetAddress address = InetAddress.getByName("COMPUTER_NAME"); 
String ip = address.getHostAddress();

需要注意的一件重要事情是,要使用 WMI,您有时需要提升权限,因此请注意这种可能性。

请做好准备,因为这比您预期的要复杂得多,并且需要进行大量字符串解析才能实际提取您想要的数据。