• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:Device Nameのチェック
#navi(../)
*Device Nameのチェック [#g9d2457b]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2003-09-25~
更新日:&lastmod;
---
category: swing
folder: DeviceName
title: Device Nameのチェック
tags: [File, JFileChooser, Fixed]
author: aterai
pubdate: 2003-09-08
description: ファイルチューザーなどで入力されたファイル名が、デバイスファイル名(con、prn、nul、auxなど)でないかチェックします。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTKz2LmiiI/AAAAAAAAAWk/HOTsKRHPAVo/s800/DeviceName.png
---
* 概要 [#summary]
ファイルチューザーなどで入力されたファイル名が、デバイスファイル名(`con`、`prn`、`nul`、`aux`など)でないかチェックします。

#contents
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTKz2LmiiI/AAAAAAAAAWk/HOTsKRHPAVo/s800/DeviceName.png)

**概要 [#h6f0e904]
ファイルチューザーなどで入力されたファイル名が、デバイスファイル名(con、prn、nul、auxなど)でないかチェックします。

#screenshot

**サンプルコード [#i6a151e5]
#code{{
 private boolean isCanonicalPath(File file) {
   if(file==null) return false;
   try{
     if(file.getCanonicalPath()==null) return false;
   }catch(IOException ioe) {
     return false;
   }
   return true;
 }
* サンプルコード [#sourcecode]
#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;
}
}}
//-&jnlp;
-&jar;
-&zip;

**解説 [#s7367925]
Windows環境で、Device Nameを含むような''正しくないファイルパス''(c:\con.txtなど)を読み書きしようとすると、Exceptionが発生します。正しいファイルパスかどうかは、File#getCanonicalPath() メソッドがnullを返すかどうかでチェックすることができます。
* 解説 [#explanation]
- `Java 1.4 + Windows`の環境で不正なファイルパス(`c:\con.txt`のような`Device Name`を含む場合など)を読み書きしようとすると`Exception`が発生する
- 正しいファイルパスかどうかは`File#getCanonicalPath()`メソッドが`null`を返すかどうかでチェック可能
- 追記: `1.5.0_08`で以下のように修正された
-- [https://bugs.openjdk.org/browse/JDK-6176051 File.isFile() は Windows プラットフォームで "con" に "false" を返すべき]
- [https://docs.oracle.com/javase/jp/8/docs/technotes/guides/io/enhancements.html#jdk6 JDK 6リリースでの拡張機能 - Java I/O の拡張機能]
-- 引用:「`CON`、`NUL`、`AUX`、`LPT`などの予約されたデバイス名には必ず`false`を返すように、`File.isFile()`の`Windows`実装が変更されました。 以前の戻り値は`true`で、それが`Unix`で使用するデバイスの動作と整合していないことから、対象ユーザーはこれをバグとみなしていました。」

-追記: JDK 5.0 Update 8(1.5.0_08)に以下のような修正が入っているようです。 
--[[File.isFile() は Windows プラットフォームで "con" に "false" を返すべき>http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6176051]]
* 参考リンク [#reference]
- [http://www.ipa.go.jp/security/awareness/vendor/programming/b08_01_main.html Windowsパス名の落とし穴]
- [https://docs.oracle.com/javase/jp/8/docs/technotes/guides/io/enhancements.html#jdk6 JDK 6リリースでの拡張機能 - Java I/O の拡張機能]

**参考リンク [#sa0510ba]
-[[Windowsパス名の落とし穴>http://www.ipa.go.jp/security/awareness/vendor/programming/b08_01_main.html]]

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