TITLE:Device Nameのチェック
#navi(../)
#tags()
RIGHT:Posted by &author(aterai); at 2003-09-25
*Device Nameのチェック [#g9d2457b]
ファイルチューザーなどで入力されたファイル名が、デバイスファイル名(con、prn、nul、auxなど)でないかチェックします。

//-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTKz2LmiiI/AAAAAAAAAWk/HOTsKRHPAVo/s800/DeviceName.png)

**サンプルコード [#i6a151e5]
#code(link){{
private boolean isCanonicalPath(File file) {
  if(file==null) return false;
  try{
    if(file.getCanonicalPath()==null) return false;
  }catch(IOException ioe) {
    return false;
  }
  return true;
}
}}

**解説 [#s7367925]
Windows環境で、Device Nameを含むような''正しくないファイルパス''(c:\con.txtなど)を読み書きしようとすると、Exceptionが発生します。正しいファイルパスかどうかは、File#getCanonicalPath() メソッドがnullを返すかどうかでチェックすることができます。

-追記: JDK 5.0 Update 8(1.5.0_08)に以下のような修正が入っているようです。 
--[http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6176051 File.isFile() は Windows プラットフォームで "con" に "false" を返すべき]

**参考リンク [#sa0510ba]
-[http://www.ipa.go.jp/security/awareness/vendor/programming/b08_01_main.html Windowsパス名の落とし穴]
-[http://docs.oracle.com/javase/jp/6/technotes/guides/io/enhancements.html#6 Java SE 6 の拡張機能 - Java I/O の拡張機能]
--引用:「CON、NUL、AUX、LPT などの予約されたデバイス名には必ず false を返すように、File.isFile() Windows 実装が変更されました。 以前の戻り値は true で、それが Unix で使用するデバイスの動作と整合していないことから、対象ユーザーはこれをバグとみなしていました。」

**コメント [#z8d1a04a]
#comment