Klassenbiliothek fuer Dateiverwaltung
ulrich
5 days ago c45b52b1242b7bc982f87347ad04fe5a2dc393eb
commit | author | age
e369b9 1 /*
c45b52 2   fm - File management class library
e369b9 3   Copyright (C) 2024  Ulrich Hilger
U 4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.fm;
19
20 import java.io.File;
21 import java.io.IOException;
22 import java.nio.file.FileVisitResult;
23 import java.nio.file.FileVisitor;
24 import java.nio.file.Files;
25 import java.nio.file.Path;
26 import java.nio.file.attribute.BasicFileAttributes;
27
28 /**
29  * Ein FileVisitor zum Verschieben oder Kopieren ganzer Ordnerstrukturen mit
30  * Hilfe der Methode Files.walkFileTree von java.nio.
31  *
32  * @author Ulrich Hilger
33  * @version 1, 14. Mai 2021
34  */
c45b52 35 public class CopyMoveVisitor extends FileHelper implements FileVisitor {
e369b9 36
U 37   private Path targetDir;
38   private int operation;
39
40   public void setTargetDir(Path targetDir) {
41     this.targetDir = targetDir;
42     //logger.fine("targetDir: " + targetDir.toString());
43   }
44
45   /**
46    * OP_COPY oder OP_MOVE
47    *
48    * @param op
49    */
50   public void setOperation(int op) {
51     this.operation = op;
52   }
53
54   @Override
55   public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException {
56     if (operation != Const.OP_DELETE) {
57       if (dir instanceof Path) {
58         Path sourceDir = (Path) dir;
59         File destFile = targetDir.resolve(sourceDir.getFileName()).toFile();
60         //logger.fine("sourceDir: " + sourceDir + ", destFile: " + destFile);
61         if (destFile.exists()) {
62           File newDir = getNewFileName(destFile);
63           destFile.renameTo(newDir);
64         }
65         destFile.mkdir();
66         this.targetDir = destFile.toPath();
67         //logger.fine("targetDir now: " + targetDir.toString());
68       }
69     }
70     return FileVisitResult.CONTINUE;
71   }
72
73   @Override
74   public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {
75     if(operation != Const.OP_DELETE) {
76       if (file instanceof Path) {
77         Path source = (Path) file;
78         File destFile = targetDir.resolve(source.getFileName()).toFile();
79         if (destFile.exists()) {
80           destFile = getNewFileName(destFile);
81         }
82         if (operation == Const.OP_MOVE) {
83           //logger.fine("move source: " + source.toString() + ", destFile: " + destFile.getAbsolutePath());
84           Files.move(source, destFile.toPath());
85         } else if (operation == Const.OP_COPY) {
86           //logger.fine("copy source: " + source.toString() + ", destFile: " + destFile.getAbsolutePath());
87           Files.copy(source, destFile.toPath());
88         }
89       }
90     } else {
91      Files.delete((Path) file);
92     }
93     return FileVisitResult.CONTINUE;
94   }
95
96   @Override
97   public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException {
98     return FileVisitResult.CONTINUE;
99   }
100
101   @Override
102   public FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException {
103     if (operation != Const.OP_DELETE) {
104       if (dir instanceof Path) {
105         Path finishedDir = (Path) dir;
106         targetDir = targetDir.getParent();
107         if(operation == Const.OP_MOVE) {
108           //logger.fine("delete " + finishedDir.toString());
109           Files.delete(finishedDir);
110         }
111       }
112       //logger.fine("targetDir now: " + targetDir.toString());
113     } else {
114       Files.delete((Path) dir);
115     }
116     return FileVisitResult.CONTINUE;
117   }
118
119 }