001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.fukurou.util; 017 018import org.opengion.fukurou.system.OgRuntimeException ; // 6.4.2.0 (2016/01/29) 019import java.io.File; 020import java.io.IOException; 021import java.util.Locale; 022import java.util.List; // 6.3.9.0 (2015/11/06) KEYS配列を止めて、変更不可Listを返す。 023import java.util.Arrays; // 6.3.9.0 (2015/11/06) KEYS配列を止めて、変更不可Listを返す。 024import java.util.Collections; // 6.3.9.0 (2015/11/06) KEYS配列を止めて、変更不可Listを返す。 025 026/** 027 * FileInfo.java は、共通的に使用される File関連の情報管理を行うクラスです。 028 * 029 * ファイルオブジェクトより、ファイル名、ファイル名(拡張子無し)、拡張子(ピリオド無)、 親パス 030 * の情報を、分割します。 031 * また、一部のFileUtilのファイル属性を扱うメソッド類を移植してきました。 032 * 033 * 絶対パス は、File#getCanonicalPath() の値を設定します。 034 * ../AAA/BBB/CCC.XLS というファイルオブジェクトに対して、 035 * 036 * FILE : CCC.xls ファイル名 037 * NAME : CCC 拡張子なしのファイル名 038 * SUFIX : xls ピリオド無しの拡張子(小文字に統一) 039 * DIR : C:\tmp\BBB 親パス 040 * 041 * ファイル名と、拡張子は、File#getName() の結果から、一番最後に見つかった 042 * ピリオドで、前後を分割します。拡張子にはピリオドを含みません。 043 * ピリオドがなければ、File#getName() の結果をファイル名に設定し、 044 * 拡張子は、空文字列を設定します。 045 * 046 * @og.rev 6.2.0.0 (2015/02/27) 新規追加 047 * @og.group ユーティリティ 048 * 049 * @version 6.0 050 * @author Kazuhiko Hasegawa 051 * @since JDK8.0, 052 */ 053public final class FileInfo { 054 // 6.3.9.0 (2015/11/06) KEYS配列を止めて、変更不可Listを返す。 055 056 /** CCC.xls ファイル名 */ 057 public final String FILE ; 058 /** CCC 拡張子なしのファイル名 */ 059 public final String NAME ; 060 /** xls ピリオド無しの拡張子(小文字に統一) */ 061 public final String SUFIX ; 062 /** C:\tmp\BBB 親パス */ 063 public final String DIR ; 064 065 // 6.3.9.0 (2015/11/06) KEYS配列を止めて、変更不可Listを返す。 066 /** ファイル情報のキーList */ 067 public static final List<String> KEY_LIST = Collections.unmodifiableList( Arrays.asList( "FILE","NAME","SUFIX","DIR" ) ); 068 069 /** 070 * ファイルオブジェクトを引数に取るコンストラクター 071 * 072 * 絶対パス は、File#getCanonicalPath() の値を設定します。 073 * ../AAA/BBB/CCC.XLS というファイルオブジェクトに対して、 074 * FILE : Fileオブジェクト File#getCanonicalFile() の値 075 * 076 * FILE : CCC.xls ファイル名 077 * NAME : CCC 拡張子なしのファイル名 078 * SUFIX : xls ピリオド無しの拡張子(小文字に統一) 079 * DIR : C:\tmp\BBB 親パス 080 * 081 * ファイルオブジェクトは、File#getCanonicalFile(File) で、絶対パスに変換後、内部処理されます。 082 * 必要な情報は、final String に設定されるため、そこから情報を取得してください。 083 * 084 * @og.rev 6.2.0.0 (2015/02/27) 新規作成 085 * 086 * @param file ファイルオブジェクト 087 */ 088 public FileInfo( final File file ) { 089 final File ccFile ; 090 try { 091 ccFile = file.getCanonicalFile(); 092 } 093 catch( final IOException ex ) { 094 final String errMsg = "ファイルの正式パス名が取得できません。[" + file + "]"; 095 throw new OgRuntimeException( errMsg,ex ); 096 } 097 098 FILE = ccFile.getName(); 099 final int extPos = FILE.lastIndexOf( '.' ); 100 if( extPos >= 0 ) { 101 NAME = FILE.substring( 0,extPos ); 102 SUFIX = FILE.substring( extPos + 1 ).toLowerCase( Locale.JAPAN ); // ピリオドを含まない 103 } 104 else { 105 NAME = FILE; 106 SUFIX = ""; // 拡張子が無ければ、空文字列 107 } 108 DIR = ccFile.getParent(); 109 } 110 111 /** 112 * キーに対応した値を返します。 113 * 114 * キーは、値が文字列の分だけです。 115 * 116 * @og.rev 6.2.0.0 (2015/02/27) 新規作成 117 * 118 * @param key ファイル情報のキー 119 * @return ファイル情報の値(キーが未設定の場合はnull) 120 * @throws NullPointerException key に null がセットされた場合 121 */ 122 public String getValue( final String key ) { 123 final String rtn ; 124 switch( key ) { 125 case "FILE" : rtn = FILE; break; 126 case "NAME" : rtn = NAME; break; 127 case "SUFIX" : rtn = SUFIX; break; 128 case "DIR" : rtn = DIR; break; 129 default : rtn = null; break; 130 } 131 132 return rtn ; 133 } 134 135 /** 136 * ファイルオブジェクトから、名前部分のみを取得します。 137 * 138 * 名前だけ取得したい場合の、簡易スタティックメソッドです。 139 * ピリオドがない場合は、ファイル名を、先頭がピリオドの場合は、 140 * ゼロ文字列です。 141 * オブジェクトを作成しません。 142 * 143 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 144 * 145 * @param file ファイルオブジェクト 146 * @return ファイルの名称(引数がnullの場合はnull) 147 */ 148 public static String getNAME( final File file ) { 149 return file == null ? null : getNAME( file.getName() ) ; 150 } 151 152 /** 153 * ファイル文字列から、名前部分のみを取得します。 154 * 155 * 名前だけ取得したい場合の、簡易スタティックメソッドです。 156 * ピリオドがない場合は、ファイル名を、先頭がピリオドの場合は、 157 * ゼロ文字列です。 158 * 159 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 160 * 161 * @param filename ファイル文字列 162 * @return ファイルの名称(引数がnullの場合はnull) 163 */ 164 public static String getNAME( final String filename ) { 165 String name = null; 166 if( filename != null ) { 167 final int extPos = filename.lastIndexOf( '.' ); 168 if( extPos >= 0 ) { 169 name = filename.substring( 0,extPos ); 170 } 171 } 172 return name ; 173 } 174 175 /** 176 * ファイルオブジェクトから、拡張子(小文字に統一)のみを取得します。 177 * 178 * 拡張子だけ取得したい場合の、簡易スタティックメソッドです。 179 * ピリオドがない場合は、ゼロ文字列を返します。 180 * オブジェクトを作成しません。 181 * 182 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 183 * 184 * @param file ファイルオブジェクト 185 * @return ファイルの拡張子(小文字に統一,引数がnullの場合はnull) 186 */ 187 public static String getSUFIX( final File file ) { 188 return file == null ? null : getSUFIX( file.getName() ) ; 189 } 190 191 /** 192 * ファイル文字列から、拡張子(小文字に統一)のみを取得します。 193 * 194 * 拡張子だけ取得したい場合の、簡易スタティックメソッドです。 195 * ピリオドがない場合は、ゼロ文字列を返します。 196 * 197 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 198 * 199 * @param filename ファイル文字列 200 * @return ファイルの拡張子(小文字に統一,引数がnullの場合はnull) 201 */ 202 public static String getSUFIX( final String filename ) { 203 String sufix = null; 204 if( filename != null ) { 205 final int extPos = filename.lastIndexOf( '.' ); 206 if( extPos >= 0 ) { 207 sufix = filename.substring( extPos + 1 ).toLowerCase( Locale.JAPAN ); // ピリオドを含まない 208 } 209 else { 210 sufix = ""; // 拡張子が無ければ、空文字列 211 } 212 } 213 return sufix ; 214 } 215 216 /** 217 * ファイルオブジェクトから、指定の拡張子かどうかを判定します。 218 * 219 * 拡張子判定に特化した、簡易スタティックメソッドです。 220 * 引数の拡張子には、ピリオドは含めません。 221 * 比較する拡張子の大文字小文字は区別しません。 222 * 223 * @og.rev 6.2.4.0 (2015/05/15) 新規作成 224 * 225 * @param file ファイルオブジェクト 226 * @param sufix 拡張子群 227 * @return true:拡張子が含まれる/false:含まれない 228 */ 229 public static boolean isSUFIX( final File file , final String... sufix ) { 230 final String fsfx = getSUFIX( file ); 231 if( fsfx != null && !fsfx.isEmpty() ) { 232 for( int i=0; i<sufix.length; i++ ) { 233 if( fsfx.equalsIgnoreCase( sufix[i] ) ) { return true; } 234 } 235 } 236 return false; 237 } 238 239 /** 240 * ファイル文字列から、指定の拡張子かどうかを判定します。 241 * 242 * 拡張子判定に特化した、簡易スタティックメソッドです。 243 * 引数の拡張子には、ピリオドは含めません。 244 * 比較する拡張子の大文字小文字は区別しません。 245 * 246 * @og.rev 6.2.4.0 (2015/05/15) 新規作成 247 * 248 * @param filename ファイル文字列 249 * @param sufix 拡張子群 250 * @return true:拡張子が含まれる/false:含まれない 251 */ 252 public static boolean isSUFIX( final String filename , final String... sufix ) { 253 final String fsfx = getSUFIX( filename ); 254 if( fsfx != null && !fsfx.isEmpty() ) { 255 for( int i=0; i<sufix.length; i++ ) { 256 if( fsfx.equalsIgnoreCase( sufix[i] ) ) { return true; } 257 } 258 } 259 return false; 260 } 261}