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