1 /*
2 StatCvs - CVS statistics generation
3 Copyright (C) 2002 Lukasz Pekacki <lukasz@pekacki.de>
4 http://statcvs.sf.net/
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 $RCSfile: FileUtils.java,v $
21 Created on $Date: 2008/04/02 11:52:02 $
22 */
23 package net.sf.statcvs.util;
24
25 import java.io.File;
26 import java.io.FileNotFoundException;
27 import java.io.FileOutputStream;
28 import java.io.FileReader;
29 import java.io.FileWriter;
30 import java.io.IOException;
31 import java.io.InputStream;
32
33 /**
34 * Some helpful file functions
35 * TODO: Remove redundancy, write tests
36 * @author Lukasz Pekacki
37 * @version $Id: FileUtils.java,v 1.20 2008/04/02 11:52:02 benoitx Exp $
38 */
39 public class FileUtils {
40 /**
41 * Copyies a file to a specified desitination
42 * @param inputName File
43 * @param destination Filename
44 * @throws FileNotFoundException if no input file exists
45 * @throws IOException if cannot read or write
46 */
47 public static void copyFile(final String inputName, final String destination) throws FileNotFoundException, IOException {
48 final File input = new File(inputName);
49 final File outputFile = new File(destination);
50 FileReader in = null;
51 FileWriter out = null;
52 try {
53 in = new FileReader(input);
54 out = new FileWriter(outputFile);
55 int c;
56 while ((c = in.read()) != -1) {
57 out.write(c);
58 }
59 } finally {
60 try {
61 if (in != null) {
62 in.close();
63 }
64 } finally {
65 if (out != null) {
66 out.close();
67 }
68 }
69 }
70 }
71
72 /**
73 * Copy a InputStream into a File
74 * @param in source
75 * @param out destination
76 * @throws FileNotFoundException if not found
77 * @throws IOException if read/write error
78 */
79 public static void copyFile(final InputStream in, final File out) throws FileNotFoundException, IOException {
80 final InputStream fis = in;
81 FileOutputStream fos = null;
82 try {
83 fos = new FileOutputStream(out);
84 final byte[] buf = new byte[1024];
85 int i = 0;
86 while ((i = fis.read(buf)) > 0) {
87 fos.write(buf, 0, i);
88 }
89 } finally {
90 try {
91 fis.close();
92 } finally {
93 if (fos != null) {
94 fos.close();
95 }
96 }
97 }
98 }
99
100 /**
101 * Takes a filename with path and returns just the filename.
102 * @param filename a filename with path
103 * @return just the filename part
104 */
105 public static String getFilenameWithoutPath(final String filename) {
106 final File f = new File(filename);
107 return f.getName();
108 }
109
110 /**
111 * Returns the os dependend path seperator
112 * @return String os dependend path seperator
113 */
114 public static String getDirSeparator() {
115 return System.getProperty("file.separator");
116 }
117
118 /**
119 * Returns the java path seperator
120 * @return String java path seperator
121 */
122 public static String getDefaultDirSeparator() {
123 // Thanks for this hint in our bug tracking system
124 return java.io.File.separator;
125 }
126
127 /**
128 * Deletes the ending directory separator of a
129 * given <code>path</code> if there is one and returns
130 * the result.
131 * Otherwise the path is unhandled returned.
132 *
133 * <p>The separator is the one used bye the
134 * underlying operating system and it is the one returned
135 * bye the <code>getDirSeparator()</code> method.
136 *
137 * @param path The <code>path</code> to delete the directory
138 * separator from.
139 * @return The <code>path</code> without the ending
140 * directory separator.
141 * @see net.sf.statcvs.util.FileUtils#getDirSeparator
142 */
143 public static String getPathWithoutEndingSlash(final String path) {
144 if (path.endsWith(getDefaultDirSeparator())) {
145 final int pos = path.lastIndexOf(getDefaultDirSeparator());
146 return path.substring(0, pos);
147 }
148 return path;
149 }
150
151 /**
152 * Concatenates <code>path</code> and filename to an
153 * absolute filename by inserting the system file separator.
154 *
155 * @param path The path to use.
156 * @param filename The filename for concatenation.
157 * @return The concatenated absolute filename.
158 */
159 public static String getAbsoluteName(final String path, final String filename) {
160 return path + getDirSeparator() + filename;
161 }
162
163 /**
164 * Returns the last compontent of a directory path.
165 * @param path a directory, ending in "/", for example "src/net/sf/statcvs/"
166 * @return the last component of the path, for example "statcvs"
167 */
168 public static String getDirectoryName(final String path) {
169 if ("".equals(path)) {
170 throw new IllegalArgumentException("can't get directory name for root");
171 }
172 final String pathWithoutLastSlash = path.substring(0, path.length() - 1);
173 final int lastSlash = pathWithoutLastSlash.lastIndexOf('/');
174 if (lastSlash == -1) {
175 return pathWithoutLastSlash;
176 }
177 return pathWithoutLastSlash.substring(lastSlash + 1);
178 }
179
180 /**
181 * Returns all but the last compontent of a directory path
182 * @param path a directory, ending in "/", for example "src/net/sf/statcvs/"
183 * @return all but the last component of the path, for example "src/net/sf/"
184 */
185 public static String getParentDirectoryPath(final String path) {
186 if ("".equals(path)) {
187 throw new IllegalArgumentException("can't get directory name for root");
188 }
189 final String pathWithoutLastSlash = path.substring(0, path.length() - 1);
190 final int lastSlash = pathWithoutLastSlash.lastIndexOf('/');
191 if (lastSlash == -1) {
192 return "";
193 }
194 return pathWithoutLastSlash.substring(0, lastSlash + 1);
195 }
196 }