我在java中编写一个应用程序,它读取目录和文件的所有路径。这已经有效了。要迁移这些文件,我需要绝对路径,即服务器IP而不是字母(在Windows系统上)。
我尝试了以下文件类中找到的方法:
System.out.println(file.getCanonicalPath());
System.out.println(file.getAbsolutePath());
两种方法都打印出确切的Windows路径而不是服务器IP,我正在读取所有路径并将它们写入txt文件。
答案 0 :(得分:3)
如您所知,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执行此操作的文章:How Can I Determine Which Drives are Mapped to Network Shares
请注意,上面的链接将向您展示如何使用VBScript进行操作,但概念是相同的。
这是关于Java的WMI接口的另一个问题:Recommended libraries/howtos for using WMI with java?
一旦您使用WMI获取映射驱动器所在位置的主机名,或者您最初返回的是UNC路径并解析出服务器名称,那么您可以调用以下内容来获取IP:
InetAddress address = InetAddress.getByName("COMPUTER_NAME");
String ip = address.getHostAddress();
需要注意的一件重要事情是,要使用WMI,您有时需要提升权限,因此请注意这种可能性。
为此做好准备要比你预期的要复杂得多,并进行大量的字符串解析以实际提取你想要的数据。
答案 1 :(得分:-2)
您可以使用以下
import java.net.InetAddress;
... <your class code>
InetAddress ip = InetAddress.getLocalHost();
// Use variable ip wherever needed