annotate artifacts-common/src/main/java/de/intevation/artifacts/common/utils/FileTools.java @ 456:afbe26bb9895

Do not try to look for . and .. while fixing paths
author Andre Heinecke <aheinecke@intevation.de>
date Fri, 01 Mar 2013 12:02:25 +0100
parents a2efc9d65a11
children 5c07601fe60e
rev   line source
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
1 /*
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
2 * Copyright (c) 2010, 2011 by Intevation GmbH
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
3 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
4 * This program is free software under the LGPL (>=v2.1)
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
5 * Read the file LGPL.txt coming with the software for details
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
6 * or visit http://www.gnu.org/licenses/ if it does not exist.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
7 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
8 package de.intevation.artifacts.common.utils;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
9
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
10 import java.io.BufferedInputStream;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
11 import java.io.File;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
12 import java.io.IOException;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
13 import java.io.InputStream;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
14 import java.io.FileInputStream;
364
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
15 import java.io.FileOutputStream;
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
16 import java.io.OutputStream;
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
17 import java.io.BufferedOutputStream;
364
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
18 import java.nio.channels.FileChannel;
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
19
369
c489256a188b Replaced legacy java.util.Stack with java.util.Deque.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 364
diff changeset
20 import java.util.Deque;
c489256a188b Replaced legacy java.util.Stack with java.util.Deque.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 364
diff changeset
21 import java.util.ArrayDeque;
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
22 import java.util.List;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
23 import java.util.Set;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
24 import java.util.HashSet;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
25 import java.util.ArrayList;
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
26 import java.util.Enumeration;
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
27 import java.util.zip.ZipFile;
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
28 import java.util.zip.ZipEntry;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
29 import java.util.zip.ZipOutputStream;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
30
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
31 import org.apache.log4j.Logger;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
32
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
33 import java.security.MessageDigest;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
34 import java.security.NoSuchAlgorithmException;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
35
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
36 public class FileTools
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
37 {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
38 private static Logger log = Logger.getLogger(FileTools.class);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
39
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
40 public static final String DIGEST =
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
41 System.getProperty("artifacts.common.file.cmp.digest", "MD5");
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
42
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
43 private FileTools() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
44 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
45
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
46
452
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
47 /** Remove everything after dot from name. */
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
48 public static final String removeExtension(String name) {
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
49 int index = name.lastIndexOf('.');
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
50 return index == -1
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
51 ? name
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
52 : name.substring(0, index);
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
53 }
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
54
b79a3598818c FíleTools#removeExtension: Moved from PRFParser.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 435
diff changeset
55
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
56 public static File getDirectory(String path, String name) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
57 if (path == null || name == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
58 return null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
59 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
60
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
61 File dir = new File(path, name);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
62
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
63 if (!dir.exists()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
64 log.debug(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
65 "Directory '" + dir.getAbsolutePath() + "' doesn't " +
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
66 "exist. Try to create it.");
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
67
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
68 return dir.mkdir() ? dir : null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
69 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
70 else {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
71 return dir.isDirectory() ? dir : null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
72 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
73 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
74
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
75 public static File repair(File file) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
76 file = file.getAbsoluteFile();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
77 if (file.exists()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
78 return file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
79 }
369
c489256a188b Replaced legacy java.util.Stack with java.util.Deque.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 364
diff changeset
80 Deque<String> parts = new ArrayDeque<String>();
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
81 File curr = file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
82 while (curr != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
83 String name = curr.getName();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
84 if (name.length() > 0) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
85 parts.push(curr.getName());
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
86 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
87 curr = curr.getParentFile();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
88 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
89
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
90 curr = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
91 OUTER: while (!parts.isEmpty()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
92 String f = parts.pop();
456
afbe26bb9895 Do not try to look for . and .. while fixing paths
Andre Heinecke <aheinecke@intevation.de>
parents: 453
diff changeset
93 if (f.equals(".") || f.equals("..")) {
afbe26bb9895 Do not try to look for . and .. while fixing paths
Andre Heinecke <aheinecke@intevation.de>
parents: 453
diff changeset
94 // No need to fix . or ..
afbe26bb9895 Do not try to look for . and .. while fixing paths
Andre Heinecke <aheinecke@intevation.de>
parents: 453
diff changeset
95 continue;
afbe26bb9895 Do not try to look for . and .. while fixing paths
Andre Heinecke <aheinecke@intevation.de>
parents: 453
diff changeset
96 }
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
97 if (curr == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
98 // XXX: Not totaly correct because there
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
99 // more than one root on none unix systems.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
100 for (File root: File.listRoots()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
101 File [] files = root.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
102 if (files == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
103 log.warn("cannot list '" + root);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
104 continue;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
105 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
106 for (File candidate: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
107 if (candidate.getName().equalsIgnoreCase(f)) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
108 curr = new File(root, candidate.getName());
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
109 continue OUTER;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
110 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
111 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
112 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
113 break;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
114 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
115 else {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
116 File [] files = curr.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
117 if (files == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
118 log.warn("cannot list: '" + curr + "'");
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
119 return file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
120 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
121 for (File candidate: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
122 if (candidate.getName().equalsIgnoreCase(f)) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
123 curr = new File(curr, candidate.getName());
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
124 continue OUTER;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
125 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
126 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
127 curr = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
128 break;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
129 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
130 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
131
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
132 if (curr == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
133 log.warn("cannot repair path '" + file + "'");
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
134 return file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
135 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
136
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
137 return curr;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
138 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
139
453
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 452
diff changeset
140 /** Object that can calculate hash of file, compare two hashed files etc. */
394
c40729bfe06d Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 383
diff changeset
141 public static class HashedFile
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
142 implements Comparable<HashedFile>
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
143 {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
144 protected File file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
145 protected long length;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
146 protected byte [] hash;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
147
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
148 public HashedFile(File file) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
149 this.file = file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
150 length = file.length();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
151 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
152
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
153 public File getFile() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
154 return file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
155 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
156
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
157 protected byte [] getHash() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
158 if (hash == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
159 InputStream in = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
160
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
161 try {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
162 in = new FileInputStream(file);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
163
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
164 MessageDigest digest = MessageDigest.getInstance(DIGEST);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
165
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
166 byte [] buf = new byte[40*1024];
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
167 int r;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
168
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
169 while ((r = in.read(buf)) >= 0) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
170 digest.update(buf, 0, r);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
171 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
172
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
173 hash = digest.digest();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
174 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
175 catch (IOException ioe) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
176 log.error(ioe);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
177 hash = new byte[0];
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
178 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
179 catch (NoSuchAlgorithmException nsae) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
180 log.error(nsae);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
181 hash = new byte[0];
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
182 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
183 finally {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
184 if (in != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
185 try {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
186 in.close();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
187 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
188 catch (IOException ioe) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
189 log.error(ioe);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
190 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
191 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
192 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
193 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
194 return hash;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
195 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
196
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
197 @Override
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
198 public int compareTo(HashedFile other) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
199 if (length < other.length) return -1;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
200 if (length > other.length) return +1;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
201 return compare(getHash(), other.getHash());
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
202 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
203
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
204 private static int compare(byte [] a, byte [] b) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
205 if (a.length < b.length) return -1;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
206 if (a.length > b.length) return +1;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
207 for (int i = 0; i < a.length; ++i) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
208 int x = a[i] & 0xff;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
209 int y = b[i] & 0xff;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
210 if (x < y) return -1;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
211 if (x > y) return +1;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
212 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
213 return 0;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
214 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
215
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
216 @Override
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
217 public boolean equals(Object other) {
394
c40729bfe06d Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 383
diff changeset
218 return other instanceof HashedFile
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
219 && ((HashedFile)other).compareTo(this) == 0;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
220 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
221
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
222 @Override
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
223 public int hashCode() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
224 return (int)(length ^ (length >>> 32));
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
225 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
226 } // class HashedFile
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
227
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
228 public static List<File> uniqueFiles(List<File> files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
229
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
230 Set<HashedFile> set = new HashSet<HashedFile>();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
231
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
232 for (File file: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
233 if (!set.add(new HashedFile(file))) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
234 log.warn("file '" + file + "' is a duplicate.");
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
235 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
236 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
237
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
238 ArrayList<File> out = new ArrayList<File>(set.size());
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
239 for (HashedFile hf: set) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
240 out.add(hf.file);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
241 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
242
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
243 return out;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
244 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
245
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
246 public interface FileVisitor {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
247 boolean visit(File file);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
248 } // Visitor
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
249
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
250 public static void walkTree(File root, FileVisitor visitor) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
251
369
c489256a188b Replaced legacy java.util.Stack with java.util.Deque.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 364
diff changeset
252 Deque<File> stack = new ArrayDeque<File>();
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
253
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
254 stack.push(root);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
255
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
256 while (!stack.isEmpty()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
257 File current = stack.pop();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
258 if (!visitor.visit(current)) break;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
259 if (current.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
260 File [] subs = current.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
261 if (subs != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
262 for (File f: subs) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
263 stack.push(f);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
264 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
265 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
266 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
267 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
268 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
269
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
270 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
271 * Deletes everything in a directory.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
272 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
273 * @param dir The directory.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
274 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
275 public final static void deleteContent(File dir) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
276 if (dir == null || !dir.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
277 return;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
278 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
279
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
280 File[] files = dir.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
281 if (files != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
282 for (File file: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
283 deleteRecursive(file);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
284 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
285 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
286
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
287 return;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
288 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
289
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
290 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
291 * Delete <i>file</i> and everything in <i>file</i> if it is a directory.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
292 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
293 * @param file The file or directory.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
294 * @return true, if deletion was successful - otherwise false.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
295 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
296 public final static boolean deleteRecursive(File file) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
297
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
298 if (file == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
299 return false;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
300 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
301
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
302 if (file.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
303 File [] files = file.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
304 if (files != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
305 for (File sub: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
306 if (!deleteRecursive(sub)) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
307 return false;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
308 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
309 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
310 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
311 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
312
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
313 return file.delete();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
314 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
315
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
316 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
317 * Put the given file or directory into a zip archive.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
318 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
319 * @param file The file or directory.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
320 * @param outputStream The stream to write the archive to.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
321 * @throws IOException if an error occured while zip creation or writing to
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
322 * output stream.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
323 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
324 public static void createZipArchive(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
325 File file,
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
326 OutputStream outputStream
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
327 )
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
328 throws IOException
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
329 {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
330 ZipOutputStream out = new ZipOutputStream(outputStream);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
331
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
332 if (file.isFile()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
333 copyFileToZip("", file, out);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
334 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
335 else if (file.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
336
369
c489256a188b Replaced legacy java.util.Stack with java.util.Deque.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 364
diff changeset
337 Deque<PrefixDir> stack = new ArrayDeque<PrefixDir>();
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
338 stack.push(new PrefixDir(file.getName() + "/", file));
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
339
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
340 while (!stack.isEmpty()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
341 PrefixDir pd = stack.pop();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
342
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
343 ZipEntry dirEntry = new ZipEntry(pd.prefix);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
344 out.putNextEntry(dirEntry);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
345 out.closeEntry();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
346
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
347 File [] files = pd.dir.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
348 if (files != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
349 for (File sub: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
350 if (sub.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
351 stack.push(new PrefixDir(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
352 pd.prefix + sub.getName() + "/",
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
353 sub));
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
354 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
355 else if (sub.isFile()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
356 copyFileToZip(pd.prefix, sub, out);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
357 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
358 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
359 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
360 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
361 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
362
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
363 out.finish();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
364 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
365
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
366
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
367 public static void extractArchive(File archive, File destDir)
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
368 throws IOException {
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
369 if (!destDir.exists()) {
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
370 destDir.mkdir();
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
371 }
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
372
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
373 ZipFile zipFile = new ZipFile(archive);
435
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
374 try {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
375 Enumeration<? extends ZipEntry> entries = zipFile.entries();
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
376
435
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
377 byte [] buffer = new byte[16384];
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
378
435
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
379 while (entries.hasMoreElements()) {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
380 ZipEntry entry = entries.nextElement();
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
381
435
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
382 String entryFileName = entry.getName();
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
383
435
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
384 File dir = buildDirectoryHierarchyFor(entryFileName, destDir);
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
385 if (!dir.exists()) {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
386 dir.mkdirs();
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
387 }
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
388
435
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
389 if (!entry.isDirectory()) {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
390 BufferedInputStream bis = new BufferedInputStream(
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
391 zipFile.getInputStream(entry));
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
392 try {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
393 BufferedOutputStream bos = new BufferedOutputStream(
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
394 new FileOutputStream(new File(destDir, entryFileName)));
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
395
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
396 try {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
397 int len;
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
398 while ((len = bis.read(buffer)) > 0) {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
399 bos.write(buffer, 0, len);
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
400 }
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
401 bos.flush();
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
402 }
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
403 finally {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
404 bos.close();
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
405 }
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
406 }
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
407 finally {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
408 bis.close();
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
409 }
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
410 } // is file
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
411 }
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
412 }
435
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
413 finally {
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
414 zipFile.close();
e39e23320a23 Fixed small problem with extractiong zip files.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 394
diff changeset
415 }
383
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
416 }
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
417
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
418 private static File buildDirectoryHierarchyFor(
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
419 String entryName,
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
420 File destDir)
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
421 {
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
422 int lastIndex = entryName.lastIndexOf('/');
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
423 String internalPathToEntry = entryName.substring(0, lastIndex + 1);
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
424 return new File(destDir, internalPathToEntry);
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
425 }
b076c9e9fdfd Added method to extract zip archives to a specified directory.
Raimund Renkert <raimund.renkert@intevation.de>
parents: 369
diff changeset
426
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
427 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
428 * A class representing a directory with a prefix.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
429 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
430 private static final class PrefixDir {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
431
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
432 String prefix;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
433 File dir;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
434
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
435 public PrefixDir(String prefix, File dir) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
436 this.prefix = prefix;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
437 this.dir = dir;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
438 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
439
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
440 } // class PrefixDir
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
441
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
442 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
443 * Write a file to zip archive.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
444 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
445 * @param prefix A prefix.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
446 * @param file The file.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
447 * @param out The output stream.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
448 * @throws IOException if an error occured while writing to zip output
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
449 * stream.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
450 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
451 private static void copyFileToZip(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
452 String prefix,
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
453 File file,
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
454 ZipOutputStream out
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
455 )
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
456 throws IOException
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
457 {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
458 String entryName = prefix + file.getName();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
459 ZipEntry entry = new ZipEntry(entryName);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
460 out.putNextEntry(entry);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
461 InputStream in = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
462 try {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
463 in =
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
464 new BufferedInputStream(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
465 new FileInputStream(file), 20*1024);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
466
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
467 byte [] buf = new byte[2048];
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
468
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
469 int r;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
470 while ((r = in.read(buf)) > 0) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
471 out.write(buf, 0, r);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
472 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
473 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
474 finally {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
475 if (in != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
476 try { in.close(); }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
477 catch (IOException ioe) {}
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
478 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
479 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
480 out.closeEntry();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
481 }
364
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
482
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
483
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
484 /**
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
485 * Copies a <i>src</i> file to <i>target</i>.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
486 *
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
487 * @param src A file (not a directory) that should be copied.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
488 * @param target The destination. This might be a file or a directory.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
489 *
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
490 * @return true, if <i>src</i> has been successfully copied; otherwise
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
491 * false.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
492 */
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
493 public static boolean copyFile(File src, File target)
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
494 throws IOException
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
495 {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
496 if (src == null || !src.exists()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
497 log.warn("Source file does not exist!");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
498 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
499 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
500
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
501 if (!src.canRead()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
502 log.warn("Cannot read Source file!");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
503 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
504 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
505
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
506 if (src.isDirectory()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
507 log.warn("Source is a directory!");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
508 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
509 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
510
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
511 if (target.isDirectory()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
512 target = new File(target, src.getName());
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
513 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
514
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
515 FileInputStream in = null;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
516 FileOutputStream out = null;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
517
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
518 try {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
519 in = new FileInputStream(src);
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
520 out = new FileOutputStream(target);
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
521
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
522 FileChannel inChannel = in.getChannel();
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
523 FileChannel outChannel = out.getChannel();
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
524
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
525 inChannel.transferTo(0l, inChannel.size(), outChannel);
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
526
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
527 return true;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
528 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
529 catch (IOException ioe) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
530 log.warn(ioe, ioe);
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
531 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
532 finally {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
533 if (in != null) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
534 try {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
535 in.close();
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
536 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
537 catch (IOException ioe) { /* do nothing here */ }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
538 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
539
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
540 if (out != null) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
541 try {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
542 out.close();
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
543 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
544 catch (IOException ioe) { /* do nothing here */ }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
545 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
546 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
547
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
548 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
549 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
550
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
551
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
552 /**
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
553 * Copies a directory <i>source</i> to a destination path <i>dest</i>.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
554 *
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
555 * @param source A directory that should be copied.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
556 * @param dest A destination directory which is created if it is not
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
557 * existing yet.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
558 *
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
559 * @return true, if the directory has been successfully copied; otherwise
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
560 * false.
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
561 */
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
562 public static boolean copyDirectory(final File source, final File dest) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
563 if (source == null || !source.exists()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
564 log.warn("Source directory does not exist!");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
565 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
566 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
567
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
568 if (!source.isDirectory()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
569 log.warn("Source is not a directory!");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
570 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
571 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
572
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
573 if (dest == null) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
574 log.warn("Destination directory is null!");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
575 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
576 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
577
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
578 if (!dest.exists()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
579 if (!dest.mkdir()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
580 log.warn("Cannot create destination directory!");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
581 return false;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
582 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
583 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
584
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
585 File[] children = source.listFiles();
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
586 int failed = 0;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
587
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
588 if (children != null && children.length > 0) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
589 for (File child: children) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
590 if (child.isFile()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
591 try {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
592 if (!copyFile(child, dest)) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
593 failed++;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
594 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
595 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
596 catch (IOException ioe) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
597 log.warn(ioe, ioe);
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
598 failed++;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
599 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
600 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
601 else if (child.isDirectory()) {
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
602 copyDirectory(child, new File(dest, child.getName()));
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
603 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
604 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
605 }
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
606
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
607 log.debug("Failed to copy " + failed + " files.");
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
608
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
609 return true;
0723859f776f Added new FileTools functions to copy files and directories.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 329
diff changeset
610 }
329
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
611 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
612 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org