2

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

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

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

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

4

2 回答 2

3

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

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

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

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

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

这是一篇关于使用 WMI 执行此操作的文章: 如何确定哪些驱动器映射到网络共享

请注意,上面的链接将向您展示如何使用 VBScript 进行操作,但概念是相同的。

这是关于 Java 的 WMI 接口的另一个 SO 问题: 推荐的库/howtos for using WMI with java?

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

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

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

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

于 2015-03-26T14:56:55.930 回答
-2

您可以使用以下

import java.net.InetAddress;
... <your class code>
InetAddress ip = InetAddress.getLocalHost();
// Use variable ip wherever needed
于 2015-03-26T14:47:28.573 回答