annotate artifacts-common/src/main/java/de/intevation/artifacts/common/utils/FileTools.java @ 329:666417d5781c

Inserted a new utility class FileTools to work with files. artifacts/trunk@2584 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 25 Aug 2011 14:30:59 +0000
parents
children 0723859f776f
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;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
15 import java.io.OutputStream;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
16
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
17 import java.util.Stack;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
18 import java.util.List;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
19 import java.util.Set;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
20 import java.util.HashSet;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
21 import java.util.ArrayList;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
22 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
23 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
24
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
25 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
26
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
27 import java.security.MessageDigest;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
28 import java.security.NoSuchAlgorithmException;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
29
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
30 public class FileTools
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
31 {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
32 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
33
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
34 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
35 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
36
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
37 private FileTools() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
38 }
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
41 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
42 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
43 return null;
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 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
47
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
48 if (!dir.exists()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
49 log.debug(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
50 "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
51 "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
52
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
53 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
54 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
55 else {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
56 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
57 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
58 }
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 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
61 file = file.getAbsoluteFile();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
62 if (file.exists()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
63 return file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
64 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
65 Stack<String> parts = new Stack<String>();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
66 File curr = file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
67 while (curr != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
68 String name = curr.getName();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
69 if (name.length() > 0) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
70 parts.push(curr.getName());
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
71 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
72 curr = curr.getParentFile();
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 curr = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
76 OUTER: while (!parts.isEmpty()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
77 String f = parts.pop();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
78 log.debug("fixing: '" + f + "'");
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
79 if (curr == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
80 // 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
81 // 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
82 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
83 File [] files = root.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
84 if (files == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
85 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
86 continue;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
87 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
88 for (File candidate: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
89 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
90 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
91 continue OUTER;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
92 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
93 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
94 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
95 break;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
96 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
97 else {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
98 File [] files = curr.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
99 if (files == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
100 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
101 return file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
102 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
103 for (File candidate: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
104 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
105 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
106 continue OUTER;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
107 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
108 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
109 curr = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
110 break;
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
114 if (curr == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
115 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
116 return file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
117 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
118
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
119 return curr;
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
122 public static class HashedFile
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
123 implements Comparable<HashedFile>
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
124 {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
125 protected File file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
126 protected long length;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
127 protected byte [] hash;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
128
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
129 public HashedFile(File file) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
130 this.file = file;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
131 length = file.length();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
132 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
133
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
134 public File getFile() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
135 return file;
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
138 protected byte [] getHash() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
139 if (hash == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
140 InputStream in = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
141
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
142 try {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
143 in = new FileInputStream(file);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
144
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
145 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
146
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
147 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
148 int r;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
149
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
150 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
151 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
152 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
153
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
154 hash = digest.digest();
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 catch (IOException ioe) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
157 log.error(ioe);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
158 hash = new byte[0];
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
159 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
160 catch (NoSuchAlgorithmException nsae) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
161 log.error(nsae);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
162 hash = new byte[0];
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 finally {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
165 if (in != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
166 try {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
167 in.close();
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 catch (IOException ioe) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
170 log.error(ioe);
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 }
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 return hash;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
176 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
177
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
178 @Override
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
179 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
180 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
181 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
182 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
183 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
184
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
185 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
186 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
187 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
188 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
189 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
190 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
191 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
192 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
193 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
194 return 0;
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 boolean equals(Object other) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
199 return other instanceof HashedFile
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
200 && ((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
201 }
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 @Override
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
204 public int hashCode() {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
205 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
206 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
207 } // class HashedFile
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
208
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
209 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
210
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
211 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
212
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
213 for (File file: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
214 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
215 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
216 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
217 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
218
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
219 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
220 for (HashedFile hf: set) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
221 out.add(hf.file);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
222 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
223
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
224 return out;
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
227 public interface FileVisitor {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
228 boolean visit(File file);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
229 } // Visitor
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
230
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
231 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
232
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
233 Stack<File> stack = new Stack<File>();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
234
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
235 stack.push(root);
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 while (!stack.isEmpty()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
238 File current = stack.pop();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
239 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
240 if (current.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
241 File [] subs = current.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
242 if (subs != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
243 for (File f: subs) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
244 stack.push(f);
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 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
247 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
248 }
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
251 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
252 * 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
253 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
254 * @param dir The directory.
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 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
257 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
258 return;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
259 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
260
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
261 File[] files = dir.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
262 if (files != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
263 for (File file: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
264 deleteRecursive(file);
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 return;
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 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
272 * 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
273 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
274 * @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
275 * @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
276 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
277 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
278
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
279 if (file == null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
280 return false;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
281 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
282
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
283 if (file.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
284 File [] files = file.listFiles();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
285 if (files != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
286 for (File sub: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
287 if (!deleteRecursive(sub)) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
288 return false;
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 }
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
294 return file.delete();
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
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 * 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
299 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
300 * @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
301 * @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
302 * @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
303 * output stream.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
304 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
305 public static void createZipArchive(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
306 File file,
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
307 OutputStream outputStream
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 throws IOException
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 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
312
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
313 if (file.isFile()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
314 copyFileToZip("", file, out);
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 else if (file.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
317
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
318 Stack<PrefixDir> stack = new Stack<PrefixDir>();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
319 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
320
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
321 while (!stack.isEmpty()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
322 PrefixDir pd = stack.pop();
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 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
325 out.putNextEntry(dirEntry);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
326 out.closeEntry();
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 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
329 if (files != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
330 for (File sub: files) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
331 if (sub.isDirectory()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
332 stack.push(new PrefixDir(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
333 pd.prefix + sub.getName() + "/",
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
334 sub));
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
335 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
336 else if (sub.isFile()) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
337 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
338 }
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 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
341 }
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
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
344 out.finish();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
345 }
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 /**
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
348 * 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
349 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
350 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
351
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
352 String prefix;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
353 File dir;
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 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
356 this.prefix = prefix;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
357 this.dir = dir;
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 } // class PrefixDir
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 * 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
364 *
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
365 * @param prefix A prefix.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
366 * @param file The file.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
367 * @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
368 * @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
369 * stream.
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
370 */
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
371 private static void copyFileToZip(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
372 String prefix,
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
373 File file,
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
374 ZipOutputStream out
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
375 )
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
376 throws IOException
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
377 {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
378 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
379 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
380 out.putNextEntry(entry);
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
381 InputStream in = null;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
382 try {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
383 in =
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
384 new BufferedInputStream(
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
385 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
386
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
387 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
388
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
389 int r;
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
390 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
391 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
392 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
393 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
394 finally {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
395 if (in != null) {
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
396 try { in.close(); }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
397 catch (IOException ioe) {}
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
398 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
399 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
400 out.closeEntry();
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
401 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
402 }
666417d5781c Inserted a new utility class FileTools to work with files.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
diff changeset
403 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org