    001package org.opengion.fukurou.model;
    002
    003import java.io.File;
    004import java.io.FileInputStream;
    005import java.io.FileNotFoundException;
    006import java.io.IOException;
    007import java.io.InputStream;
    008import java.nio.file.Files;
    009import java.nio.file.Paths;
    010import java.nio.file.StandardCopyOption;
    011import java.util.ArrayList;
    012import java.util.List;
    013
    014import org.opengion.fukurou.util.HybsFileFilter;
    015
    016/**
    017 * ローカルサーバのファイル操作クラス
    018 *
    019 * FileOperationFactoryでデフォルトとして設定されており、
    020 * ローカルサーバでのファイル操作を行います。
    021 * ※java.io.Fileと同等のファイル操作になります。
    022 *
    023 * @og.group ファイル操作
    024 *
    025 * @og.rev 5.10.8.0 (2019/02/01) 新規作成
    026 * @author oota
    027 * @sinse JDK7.0
    028 */
    029public class DefaultFileOperation extends AbstractFileOperation {
    030        // ファイル操作用
    031        private final File file;
    032
    033        /**
    034         * コンストラクタ
    035         *
    036         * 引数のパスから、java.io.Fileインスタンスを生成します。
    037         * @param inPath ファイルパス
    038         *
    039         */
    040        public DefaultFileOperation(String inPath) {
    041                file = new File(inPath);
    042        }
    043
    044        /**
    045         * コンストラクタ
    046         *
    047         * 引数のパスから、java.io.Fileインスタンスを生成します。
    048         * FileOperationFactoryからの呼び出し用で、
    049         * このクラスではbuketは使用しません。
    050         * @param buket バケット
    051         * @param inPath ファイルパス
    052         */
    053        public DefaultFileOperation(String buket, String inPath) {
    054                this(inPath);
    055        }
    056
    057        /**
    058         * InputStreamのデータを書き込みます。
    059         *
    060         * @param is 書き込みデータのInputStream
    061         * @throws IOException
    062         */
    063        @Override
    064        public void write(final InputStream is) throws IOException {
    065                // InpustStreamを対象パスに出力
    066                Files.copy(is, Paths.get(file.getPath()), StandardCopyOption.REPLACE_EXISTING);
    067        }
    068
    069        /**
    070         * データを読み込み、InputStreamとして、返します。
    071         *
    072         * @return 読み込みデータのInputStream
    073         * @throws FileNotFoundException
    074         */
    075        @Override
    076        public InputStream read() throws FileNotFoundException {
    077                return new FileInputStream(file.getPath());
    078        }
    079
    080        /**
    081         * ファイルを削除します。
    082         *
    083         * @return 成否フラグ
    084         */
    085        @Override
    086        public boolean delete() {
    087                return file.delete();
    088        }
    089
    090        /**
    091         * ファイルを指定先に、コピーします。
    092         *
    093         * @param afPath コピー先
    094         * @return 成否フラグ
    095         */
    096        @Override
    097        public boolean copy(String afPath) {
    098                boolean flgRtn = false;
    099
    100                try {
    101                        // 指定パスのファイルを、指定先にコピー from;jdk7
    102                        Files.copy(Paths.get(file.getPath()), Paths.get(afPath), StandardCopyOption.REPLACE_EXISTING);
    103                        flgRtn = true;
    104                } catch (IOException ie) {
    105                        // スルーしてfalseを返す
    106                }
    107
    108                return flgRtn;
    109        }
    110
    111        /**
    112         * ファイルを指定先に、移動します。
    113         *
    114         * @param afPath 移動先
    115         * @return 成否フラグ
    116         */
    117        @Override
    118        public boolean move(String afPath) {
    119                boolean flgRtn = false;
    120
    121                try {
    122                        // 指定パスのファイルを、指定先に移動 from:jdk7
    123                        Files.move(Paths.get(file.getPath()), Paths.get(afPath), StandardCopyOption.REPLACE_EXISTING);
    124                        flgRtn = true;
    125                } catch (IOException ie) {
    126                        // スルーしてfalseを返す
    127                }
    128                return flgRtn;
    129        }
    130
    131        /**
    132         * 設定パスを取得します。
    133         *
    134         * @return 設定パス
    135         */
    136        @Override
    137        public String getPath() {
    138                return file.getPath();
    139        }
    140
    141        /**
    142         * 絶対パスを取得します。
    143         *
    144         * @return 絶対パス
    145         */
    146        @Override
    147        public String getAbsolutePath() {
    148                return file.getAbsolutePath();
    149        }
    150
    151        /**
    152         * 名称を取得します。
    153         *
    154         * @return 名称
    155         */
    156        @Override
    157        public String getName() {
    158                return file.getName();
    159        }
    160
    161        /**
    162         * 親のパスを取得します。
    163         *
    164         * @return 親のパス
    165         */
    166        @Override
    167        public String getParent() {
    168                return file.getParent();
    169        }
    170
    171        /**
    172         * ファイルサイズを返します
    173         *
    174         * @return ファイルサイズ
    175         */
    176        @Override
    177        public long length() {
    178                return file.length();
    179        }
    180
    181        /**
    182         * 最終更新時刻を取得します。
    183         *
    184         * @return 最終更新時刻
    185         */
    186        @Override
    187        public long lastModified() {
    188                return file.lastModified();
    189        }
    190
    191        /**
    192         * ファイルの場合は、trueを返します。
    193         *
    194         * @return ファイルフラグ
    195         */
    196        @Override
    197        public boolean isFile() {
    198                return file.isFile();
    199        }
    200
    201        /**
    202         * ディレクトリの場合は、trueを返します。
    203         *
    204         * @return ディレクトリフラグ
    205         */
    206        @Override
    207        public boolean isDirectory() {
    208                return file.isDirectory();
    209        }
    210
    211        /**
    212         * 存在する場合は、trueを返します。
    213         *
    214         * @return 存在フラグ
    215         */
    216        @Override
    217        public boolean exists() {
    218                return file.exists();
    219        }
    220
    221        /**
    222         * パスのファイルとディレクトリ一覧を取得します。
    223         *
    224         * @return ファイルとティレクトリ一覧
    225         */
    226        @Override
    227        public FileOperation[] listFiles() {
    228                return listFiles(new HybsFileFilter());
    229        }
    230
    231        /**
    232         * パスのファイルとディレクトリ一覧を取得して、
    233         * 引数でフィルターを行います。
    234         *
    235         * @param filter フィルター
    236         * @return      ファイルとディレクトリ一覧
    237         */
    238        @Override
    239        public FileOperation[] listFiles(FileOperationFileFilter filter) {
    240                // 存在チェック
    241                if (!exists()) {
    242                        return new FileOperationInfo[0];
    243                }
    244
    245                // カノニカルファイル取得
    246                File trg = null;
    247                try {
    248                        trg = file.getCanonicalFile();
    249                } catch (IOException ie) {
    250                        return new FileOperationInfo[0];
    251                }
    252
    253                // 直下のファイルとディレクトリ情報の取得
    254                File[] files = trg.listFiles();
    255
    256                // 取得情報をリストに格納
    257                List<FileOperationInfo> fileList = new ArrayList<FileOperationInfo>();
    258                for (File file : files) {
    259                        FileOperationInfo info = new FileOperationInfo();
    260
    261                        info.setPath(file.getPath());
    262                        info.setName(file.getName());
    263                        info.setParent(file.getParent());
    264                        info.setLastModifiedValue(file.lastModified());
    265                        info.setCanWrite(file.canWrite());
    266                        info.setCanRead(file.canRead());
    267                        info.setHidden(file.isHidden());
    268
    269                        if (file.isFile()) {
    270                                // ファイル情報
    271                                info.setFile(true);
    272                                info.setSize(file.length());
    273                        } else if (file.isDirectory()) {
    274                                // ディレクトリ情報
    275                                info.setDirectory(true);
    276                        }
    277
    278                        fileList.add(info);
    279                }
    280
    281                // フィルタ処理
    282                FileOperation[] rtnArray = filter(fileList, filter);
    283
    284                return rtnArray;
    285        }
    286
    287        /**
    288         * ディレクトリを作成します。
    289         *
    290         * ※１つのディレクトリのみ作成します。
    291         * (クラウドストレージにはディレクトリの概念が無いため、
    292         * 作成は行わず、trueを返します)
    293         *
    294         * @return 成否フラグ
    295         */
    296        @Override
    297        public boolean mkdir() {
    298                return file.mkdir();
    299        }
    300
    301        /**
    302         * ディレクトリを作成します。
    303         *
    304         * ※複数のディレクトリを作成します。
    305         * (クラウドストレージにはディレクトリの概念が無いため、
    306         * 作成は行わず、trueを返します)
    307         *
    308         * @return 成否フラグ
    309         */
    310        @Override
    311        public boolean mkdirs() {
    312                return file.mkdirs();
    313        }
    314
    315        /**
    316         * 指定のファイル情報のファイル名に変更します。
    317         *
    318         * @param dest 変更後のファイル情報
    319         * @return 成否フラグ
    320         */
    321        @Override
    322        public boolean renameTo(FileOperation dest) {
    323                return file.renameTo(new File(dest.getPath()));
    324        }
    325
    326        /**
    327         * 親のディレクトリを返します。
    328         *
    329         * @return 親のディレクトリ
    330         */
    331        @Override
    332        public FileOperation getParentFile() {
    333                return new DefaultFileOperation(getParent());
    334        }
    335
    336        /**
    337         * 書き込み可能フラグ
    338         *
    339         * ※クラウドストレージの場合は、
    340         * 必ずtrueを返します。
    341         *
    342         * @return 書き込み可能フラグ
    343         */
    344        @Override
    345        public boolean canWrite() {
    346                return file.canWrite();
    347        }
    348
    349        /**
    350         * 読み取り可能フラグ
    351         *
    352         * ※クラウドストレージの場合は、
    353         * 必ずtrueを返します。
    354         *
    355         * @return 読み取り可能フラグ
    356         */
    357        @Override
    358        public boolean canRead() {
    359                return file.canRead();
    360        }
    361
    362        /**
    363         * 隠しファイルフラグ
    364         *
    365         * ※クラウドストレージの場合は、
    366         * 必ずfalseを返します。
    367         *
    368         * @return 隠しファイルフラグ
    369         */
    370        @Override
    371        public boolean isHidden() {
    372                return file.isHidden();
    373        }
    374
    375        /**
    376         * 新規ファイル作成
    377         *
    378         * 既にファイルが存在しない場合のみ、
    379         * 空のファイルを作成します。
    380         *
    381         * @return 成否フラグ
    382         * @throws IOException
    383         */
    384        @Override
    385        public boolean createNewFile() throws IOException {
    386                return file.createNewFile();
    387        }
    388
    389        /**
    390         * 最終更新時刻の更新
    391         *
    392         * 最終更新時刻の更新を行います。
    393         * ※クラウドストレージの場合は、
    394         * 最終更新時刻の更新を行えません。
    395         *
    396         * @param time 更新する最終更新時刻
    397         * @return 成否フラグ
    398         */
    399        @Override
    400        public boolean setLastModified(long time) {
    401                return file.setLastModified(time);
    402        }
    403
    404        /**
    405         * カノニカルファイル情報を取得します。
    406         *
    407         * ※ローカルサーバのみ通常ファイルと、
    408         * カノニカルファイルで異なります。
    409         *
    410         * @return カノニカルファイル情報
    411         * @throws IOException
    412         */
    413        @Override
    414        public FileOperation getCanonicalFile() throws IOException {
    415                File path = file.getCanonicalFile();
    416                return new DefaultFileOperation(path.getPath());
    417        }
    418
    419        /**
    420         * toStringでは、パスを返します。
    421         *
    422         * @return パス
    423         */
    424        @Override
    425        public String toString() {
    426                return getPath();
    427        }
    428
    429        /**
    430         * テスト用メソッドです
    431         *
    432         * @param args
    433         */
    434        public static void main(String[] args) {
    435                // listTest();
    436                // methodTest();
    437        }
    438        /* テスト用
    439        // リストテスト用
    440        public static void listTest() {
    441                String path = "";
    442                FileOperation file = new DefaultFileOperation(path);
    443
    444                try {
    445                        // フィルタを行う場合
    446                        // 以下の場合は、bで始まるファイルと、全てのディレクトリ（指定パスの直下)が取得されます。
    447                        // HybsFileOperationFileFilter filter = new HybsFileOperationFileFilter();
    448                        HybsFileFilter filter = new HybsFileFilter(true);
    449                        filter.startsWith("b");
    450
    451                        FileOperation[] list = file.getCanonicalFile().listFiles(filter);
    452
    453                        System.out.println(list.length);
    454                        for(FileOperation f: list) {
    455                                System.out.println(f.getPath());
    456                        }
    457                }catch(Exception e) {
    458                        System.out.println(e.getMessage());
    459                }
    460        }
    461
    462        // メソッドテスト用
    463        public static void methodTest() {
    464                String path = "H:/tmp/test/newfile.txt";
    465                FileOperation file = new DefaultFileOperation(path);
    466
    467                String afPath = "H:/tmp/test/af.txt";
    468                FileOperation af = new DefaultFileOperation(afPath);
    469
    470                try {
    471                        boolean rtn =
    472                        //file.renameTo(af);
    473                        file.createNewFile();
    474                        //file.mkdirs();
    475                        //file.getCanonicalFile().exists();
    476                        System.out.println(rtn);
    477                }catch(Exception e) {
    478                        System.out.println(e.getMessage());
    479                }
    480        }
    481        //*/
    482}