View Javadoc

1   /*
2    * $Source: /usr/cvsroot/melati/melati/src/main/java/org/melati/util/FileUtils.java,v $
3    * $Revision: 1.9 $
4    *
5    * Copyright (C) 2000 Myles Chippendale
6    *
7    * Part of Melati (http://melati.org), a framework for the rapid
8    * development of clean, maintainable web applications.
9    *
10   * Melati is free software; Permission is granted to copy, distribute
11   * and/or modify this software under the terms either:
12   *
13   * a) the GNU General Public License as published by the Free Software
14   *    Foundation; either version 2 of the License, or (at your option)
15   *    any later version,
16   *
17   *    or
18   *
19   * b) any version of the Melati Software License, as published
20   *    at http://melati.org
21   *
22   * You should have received a copy of the GNU General Public License and
23   * the Melati Software License along with this program;
24   * if not, write to the Free Software Foundation, Inc.,
25   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA to obtain the
26   * GNU General Public License and visit http://melati.org to obtain the
27   * Melati Software License.
28   *
29   * Feel free to contact the Developers of Melati (http://melati.org),
30   * if you would like to work out a different arrangement than the options
31   * outlined here.  It is our intention to allow Melati to be used by as
32   * wide an audience as possible.
33   *
34   * This program is distributed in the hope that it will be useful,
35   * but WITHOUT ANY WARRANTY; without even the implied warranty of
36   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37   * GNU General Public License for more details.
38   *
39   * Contact details for copyright holder:
40   *
41   *     Myles Chippendale <mylesc At paneris.org>
42   *     http://paneris.org/
43   *     29 Stanley Road, Oxford, OX4 1QY, UK
44   */
45  
46  package org.melati.util;
47  
48  import java.io.IOException;
49  import java.io.File;
50  import java.io.FileOutputStream;
51  
52  /**
53   * An assortment of useful operations on <code>File</code>s.
54   */
55  public final class FileUtils {
56  
57    private FileUtils() {}
58    
59    /**
60     * Returns a File in the given <code>directory</code> which does
61     * not already exist. 
62     *
63     * This file is found by starting with the given
64     * <code>filename</code>. If a file of this name already exists we
65     * put 0 then 1,2,... before the extension until we find one that
66     * does not exists.
67     * <p>
68     * For instance, if <code>newfile.txt</code> exists then we
69     * check <code>newfile0.txt</code>, <code>newfile1.txt</code>, ...
70     * until we find a new filename.
71     * 
72     * @return a new File whose name has been made unique 
73     */
74  
75    public static File withUniqueName(File file) {
76      String directory = file.getParent();
77      String filename = file.getName();
78      int dot = filename.lastIndexOf(".");
79      String start = (dot != -1) ? filename.substring(0,dot) : filename;
80      String extension =
81          (dot != -1) ? filename.substring(dot,filename.length()) : "";
82  
83      int count = 0;
84      while (file.exists()) {
85        filename = start + (count++) + extension;
86        file = new File(directory, filename);
87      }
88      return file;
89    }
90  
91    /**
92     * Write a byte array to a given file.
93     * @param file file to write to
94     * @param data to write to file
95     * @return File with data written to it
96     */
97    public static File writeFile(File file, byte[] data) throws IOException {
98      FileOutputStream os=new FileOutputStream(file);
99      os.write(data);
100     os.close();
101     return file;
102   }
103 
104   /**
105    * Mark a file as executable.  Does <TT>chmod +x <I>file</I></TT> on
106    * Unix, else does nothing.
107    */
108   public static void makeExecutable(File file) throws IOException {
109     if (File.separatorChar == '/')
110       // we're unix
111       try {
112         if (Runtime.getRuntime().exec(
113                 new String[] { "chmod", "+x", file.getPath() }).waitFor() != 0)
114           throw new IOException("chmod +x " + file + " failed");
115       }
116       catch (InterruptedException e) {
117         throw new IOException("Interrupted waiting for chmod +x " + file);
118       }
119   }
120 }