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 /** 8.0.0.0 (2021/09/30) ファイルの拡張子の区切りを表す文字 */ 055 public static final char EXTENSION_SEPARATOR = '.'; 056 057 // 6.3.9.0 (2015/11/06) KEYS配列を止めて、変更不可Listを返す。 058 059 /** CCC.xls ファイル名 */ 060 public final String FILE ; 061 /** CCC 拡張子なしのファイル名 */ 062 public final String NAME ; 063 /** xls ピリオド無しの拡張子(小文字に統一) */ 064 public final String SUFIX ; 065 /** C:\tmp\BBB 親パス */ 066 public final String DIR ; 067 068 // 6.3.9.0 (2015/11/06) KEYS配列を止めて、変更不可Listを返す。 069 /** ファイル情報のキーList */ 070 public static final List<String> KEY_LIST = Collections.unmodifiableList( Arrays.asList( "FILE","NAME","SUFIX","DIR" ) ); 071 072 /** 073 * ファイルオブジェクトを引数に取るコンストラクター 074 * 075 * 絶対パス は、File#getCanonicalPath() の値を設定します。 076 * ../AAA/BBB/CCC.XLS というファイルオブジェクトに対して、 077 * FILE : Fileオブジェクト File#getCanonicalFile() の値 078 * 079 * FILE : CCC.xls ファイル名 080 * NAME : CCC 拡張子なしのファイル名 081 * SUFIX : xls ピリオド無しの拡張子(小文字に統一) 082 * DIR : C:\tmp\BBB 親パス 083 * 084 * ファイルオブジェクトは、File#getCanonicalFile(File) で、絶対パスに変換後、内部処理されます。 085 * 必要な情報は、final String に設定されるため、そこから情報を取得してください。 086 * 087 * @og.rev 6.2.0.0 (2015/02/27) 新規作成 088 * 089 * @param file ファイルオブジェクト 090 */ 091 public FileInfo( final File file ) { 092 final File ccFile ; 093 try { 094 ccFile = file.getCanonicalFile(); 095 } 096 catch( final IOException ex ) { 097 final String errMsg = "ファイルの正式パス名が取得できません。[" + file + "]"; 098 throw new OgRuntimeException( errMsg,ex ); 099 } 100 101 FILE = ccFile.getName(); 102 final int extPos = FILE.lastIndexOf( '.' ); 103 if( extPos >= 0 ) { 104 NAME = FILE.substring( 0,extPos ); 105 SUFIX = FILE.substring( extPos + 1 ).toLowerCase( Locale.JAPAN ); // ピリオドを含まない 106 } 107 else { 108 NAME = FILE; 109 SUFIX = ""; // 拡張子が無ければ、空文字列 110 } 111 DIR = ccFile.getParent(); 112 } 113 114 /** 115 * キーに対応した値を返します。 116 * 117 * キーは、値が文字列の分だけです。 118 * 119 * @og.rev 6.2.0.0 (2015/02/27) 新規作成 120 * 121 * @param key ファイル情報のキー 122 * @return ファイル情報の値(キーが未設定の場合はnull) 123 * @throws NullPointerException key に null がセットされた場合 124 */ 125 public String getValue( final String key ) { 126 final String rtn ; 127 switch( key ) { 128 case "FILE" : rtn = FILE; break; 129 case "NAME" : rtn = NAME; break; 130 case "SUFIX" : rtn = SUFIX; break; 131 case "DIR" : rtn = DIR; break; 132 default : rtn = null; break; 133 } 134 135 return rtn ; 136 } 137 138 /** 139 * ファイルオブジェクトから、名前部分のみを取得します。 140 * 141 * 名前だけ取得したい場合の、簡易スタティックメソッドです。 142 * ピリオドがない場合は、ファイル名を、先頭がピリオドの場合は、 143 * ゼロ文字列です。 144 * オブジェクトを作成しません。 145 * 146 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 147 * 148 * @param file ファイルオブジェクト 149 * @return ファイルの名称(引数がnullの場合はnull) 150 */ 151 public static String getNAME( final File file ) { 152 return file == null ? null : getNAME( file.getName() ) ; 153 } 154 155 /** 156 * ファイル文字列から、名前部分のみを取得します。 157 * 158 * 名前だけ取得したい場合の、簡易スタティックメソッドです。 159 * ピリオドがない場合は、ファイル名を、先頭がピリオドの場合は、 160 * ゼロ文字列です。 161 * 162 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 163 * 164 * @param filename ファイル文字列 165 * @return ファイルの名称(引数がnullの場合はnull) 166 */ 167 public static String getNAME( final String filename ) { 168 String name = null; 169 if( filename != null ) { 170 final int extPos = filename.lastIndexOf( '.' ); 171 if( extPos >= 0 ) { 172 name = filename.substring( 0,extPos ); 173 } 174 } 175 return name ; 176 } 177 178 /** 179 * ファイルオブジェクトから、拡張子(小文字に統一)のみを取得します。 180 * 181 * 拡張子だけ取得したい場合の、簡易スタティックメソッドです。 182 * ピリオドがない場合は、ゼロ文字列を返します。 183 * オブジェクトを作成しません。 184 * 185 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 186 * 187 * @param file ファイルオブジェクト 188 * @return ファイルの拡張子(小文字に統一,引数がnullの場合はnull) 189 */ 190 public static String getSUFIX( final File file ) { 191 return file == null ? null : getSUFIX( file.getName() ) ; 192 } 193 194 /** 195 * ファイル文字列から、拡張子(小文字に統一)のみを取得します。 196 * 197 * 拡張子だけ取得したい場合の、簡易スタティックメソッドです。 198 * ピリオドがない場合は、ゼロ文字列を返します。 199 * 200 * @og.rev 6.2.3.0 (2015/05/01) 新規作成 201 * 202 * @param filename ファイル文字列 203 * @return ファイルの拡張子(小文字に統一,引数がnullの場合はnull) 204 */ 205 public static String getSUFIX( final String filename ) { 206 String sufix = null; 207 if( filename != null ) { 208 final int extPos = filename.lastIndexOf( '.' ); 209 if( extPos >= 0 ) { 210 sufix = filename.substring( extPos + 1 ).toLowerCase( Locale.JAPAN ); // ピリオドを含まない 211 } 212 else { 213 sufix = ""; // 拡張子が無ければ、空文字列 214 } 215 } 216 return sufix ; 217 } 218 219 /** 220 * ファイルオブジェクトから、指定の拡張子かどうかを判定します。 221 * 222 * 拡張子判定に特化した、簡易スタティックメソッドです。 223 * 引数の拡張子には、ピリオドは含めません。 224 * 比較する拡張子の大文字小文字は区別しません。 225 * 226 * @og.rev 6.2.4.0 (2015/05/15) 新規作成 227 * 228 * @param file ファイルオブジェクト 229 * @param sufix 拡張子群 230 * @return true:拡張子が含まれる/false:含まれない 231 */ 232 public static boolean isSUFIX( final File file , final String... sufix ) { 233 final String fsfx = getSUFIX( file ); 234 if( fsfx != null && !fsfx.isEmpty() ) { 235 for( int i=0; i<sufix.length; i++ ) { 236 if( fsfx.equalsIgnoreCase( sufix[i] ) ) { return true; } 237 } 238 } 239 return false; 240 } 241 242 /** 243 * ファイル文字列から、指定の拡張子かどうかを判定します。 244 * 245 * 拡張子判定に特化した、簡易スタティックメソッドです。 246 * 引数の拡張子には、ピリオドは含めません。 247 * 比較する拡張子の大文字小文字は区別しません。 248 * 249 * @og.rev 6.2.4.0 (2015/05/15) 新規作成 250 * 251 * @param filename ファイル文字列 252 * @param sufix 拡張子群 253 * @return true:拡張子が含まれる/false:含まれない 254 */ 255 public static boolean isSUFIX( final String filename , final String... sufix ) { 256 final String fsfx = getSUFIX( filename ); 257 if( fsfx != null && !fsfx.isEmpty() ) { 258 for( int i=0; i<sufix.length; i++ ) { 259 if( fsfx.equalsIgnoreCase( sufix[i] ) ) { return true; } 260 } 261 } 262 return false; 263 } 264}