得到与服务器ip而不是信件的path

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

我试过以下在文件类中find的方法:

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

这两种方法打印出确切的Windowspath,而不是我读取所有path的服务器IP,并将它们写入一个txt文件。

如您所知,Java是可移植的,可以让您编写在多个操作系统上运行的代码。 当你调用其中的任何一种方法时,Java会询问底层操作系统该文件的路径,并返回你所看到的内容。 在Windows机器上,如果是映射(或本地)驱动器,则这将是包含驱动器盘符的路径。 有时您可能会得到一个UNC路径,其中包括服务器名称和共享。 对于其他操作系统,这种行为会稍有不同,因为它会返回操作系统看到的路径。 但是,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 Management Instrumentation。 这使您可以对Windows进行类似SQL的调用来查询有关系统的信息。 在这种情况下,您需要解析出正在返回给您的驱动器号,然后进行WMI调用。

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

只要注意上面的链接会告诉你如何用VBScript来做到这一点,但是这个概念是一样的。

下面是关于Java的WMI接口的另一个SO问题: 在java中使用WMI的推荐库/ howtos?

一旦您使用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