2

ディレクトリとファイルのすべてのパスを読み取るアプリケーションを Java でコーディングしています。これはすでに機能しています。これらのファイルを移行するには、(Windows システムでは) 文字ではなくサーバー IP である絶対パスが必要です。

ファイルクラス内にある次のメソッドを試しました:

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

どちらの方法でも、すべてのパスを読み取って txt ファイルに書き込むサーバー IP の代わりに、正確な Windows パスが出力されます。

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 Management Instrumentation の略です。これにより、Windows に対して SQL のような呼び出しを行い、システムに関する情報を照会できます。この場合、返されたドライブ文字を解析してから、WMI 呼び出しを行う必要があります。

WMI を使用してこれを行う方法については、次の記事を参照してください: ネットワーク共有にマップされているドライブを確認するにはどうすればよいですか?

上記のリンクは VBScript でそれを行う方法を示していますが、概念は同じであることに注意してください。

Java の WMI インターフェイスに関する別の SO の質問があります: Java で WMI を使用するための推奨ライブラリ/ハウツー?

WMI を使用して、マップされたドライブが配置されている場所のホスト名を取得したら、または最初に UNC パスが返され、サーバー名を解析した場合は、次を呼び出して IP を取得できます。

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

注意すべき重要な点の 1 つは、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 に答える