LoginSignup
0
1

More than 5 years have passed since last update.

【.NET】IPv6を直接ファイル名には使えない

Posted at

はじめに

アプリケーションの改修作業をしていて、自PCでは動作していたが同僚のPCでは例外エラーが出て動作しなかった。
エラー名は憶えてないが、「cache\comm\fe80::6c2c:7539:7e8a:c350%11.xml」にはアクセスできない旨のエラーであった。

原因

キャッシュ用ファイルとしてIPv4のアドレスを想定してファイルを作成しようとしたところ、IPv6のアドレスとなり、ファイル名に使えない文字のコロン(:)が含まれているためエラーとなった。

ファイル名に使わない方が良い文字

プログラム上ではIPアドレスを取得する際に先頭アドレスを返すようになっていた、自PCではIPv4を優先にするようにしていたため、問題が発生しなかったが、同僚PCはIPv6が返された。

「IPv6無効設定」はもう古い?IPv6を有効にしたままIPv4の優先順位を上げる設定

対応

単純に先頭アドレスの取得ではなく、AddressFamily.InterNetworkの条件を入れてIPv4アドレスを返すように修正した。LINQを使ってシンプルに。
Get IPv4 addresses from Dns.GetHostEntry()

public static string GetIpAddress() {
    IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList
                         .FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);

    return Convert.ToString(ipAddress);
}

別の対応としては、IPアドレスにIPv6を返ることも考慮して、ファイル名にする際にコロン(:)を除外してしまう。
cache\comm\fe806c2c75397e8ac350%11.xml

return GetIpAddress().Replace(":","") + ".xml";

パーセント(%)はファイル名としては使用できます。
ちなみに、IPv6の「%」の後の文字はインターフェイス識別子です。

いまさら聞けない、IPv6アドレス体系の基礎 (1/2)

最後に

IPv4アドレスを取得する方法は何番煎じのネタなので別に書かなくてもよかったのですが、別の切り口で書いてみれば、何か発見があるかなと思いました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1