All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jlibs.core.io.FileUtil Maven / Gradle / Ivy

There is a newer version: 3.0.1
Show newest version
/**
 * Copyright 2015 Santhosh Kumar Tekuri
 *
 * The JLibs authors license this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package jlibs.core.io;

import jlibs.core.graph.*;
import jlibs.core.graph.walkers.PreorderWalker;
import jlibs.core.lang.ImpossibleException;
import jlibs.core.lang.StringUtil;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Stack;

/**
 * @author Santhosh Kumar T
 */
public class FileUtil{
    public static final String PATH_SEPARATOR = File.pathSeparator;
    public static final String SEPARATOR = File.separator;
    public static final String LINE_SEPARATOR = System.getProperty("line.separator");

    public static final File JAVA_HOME = new File(System.getProperty("java.home"));
    public static final File USER_HOME = new File(System.getProperty("user.home"));
    public static final File USER_DIR = new File(System.getProperty("user.dir"));
    public static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"));

    public static URL toURL(File file){
        try{
            return file.toURI().toURL();
        }catch(MalformedURLException ex){
            throw new ImpossibleException(ex);
        }
    }

    /*-------------------------------------------------[ Name and Extension ]---------------------------------------------------*/

    /**
     * splits given fileName into name and extension.
     *
     * @param fileName fileName
     * @return string array is of length 2, where 1st item is name and 2nd item is extension(null if no extension)
     */
    public static String[] split(String fileName){
        int dot = fileName.lastIndexOf('.');
        if(dot==-1)
            return new String[]{ fileName, null };
        else
            return new String[] { fileName.substring(0, dot), fileName.substring(dot+1)};
    }

    /** Returns name of the file without extension */
    public static String getName(String fileName){
        int dot = fileName.lastIndexOf('.');
        return dot==-1 ? fileName : fileName.substring(0, dot);
    }

    /** Returns extension of the file. Returns null if there is no extension */
    public static String getExtension(String fileName){
        int dot = fileName.lastIndexOf('.');
        return dot==-1 ? null : fileName.substring(dot+1);
    }

    /*-------------------------------------------------[ Find Free File ]---------------------------------------------------*/

    /**
     * Finds a free file (i.e non-existing) in specified directory, using specified pattern.
     * for example:
     *      findFreeFile(myDir, "sample${i}.xml", false)
     *
     * will search for free file in order:
     *      sample1.xml, sample2.xml, sample3.xml and so on
     *
     * if tryEmptyVar is true, it it seaches for free file in order:
     *      sample.xml, sample2.xml, sample3.xml and so on
     *
     * the given pattern must have variable part ${i}
     */
    public static File findFreeFile(final File dir, String pattern, boolean tryEmptyVar){
        String name = StringUtil.suggest(new Filter(){
            @Override
            public boolean select(String name){
                return !new File(dir, name).exists();
            }
        }, pattern, tryEmptyVar);

        return new File(dir, name);
    }

    /**
     * if file doesn't exist, it returns the same file. otherwize, it will find free
     * file as follows:
     *
     * if given file name is test.txt, then it searches for non existing file in order:
     *      test2.txt, test3.txt, test4.txt and so on
     *
     * if given file name is test(i,e with no extension), then it searches for non existing file in order:
     *      test2, test3, test4 and so on
     */
    public static File findFreeFile(File file){
        if(!file.exists())
            return file;

        String parts[] = split(file.getName());
        String pattern = parts[1]==null ? parts[0]+"${i}" : parts[0]+"${i}."+parts[1];
        return findFreeFile(file.getParentFile(), pattern, true);
    }

    /*-------------------------------------------------[ Delete ]---------------------------------------------------*/

    /**
     * deletes specified file or directory
     * if given file/dir doesn't exist, simply returns
     */
    public static void delete(File file) throws IOException{
        if(!file.exists())
            return;

        if(file.isFile()){
            if(!file.delete())
                throw new IOException("couldn't delete file :"+file);
        }else{
            try{
                WalkerUtil.walk(new PreorderWalker(file, FileNavigator.INSTANCE), new Processor(){
                    @Override
                    public boolean preProcess(File file, Path path){
                        return true;
                    }

                    @Override
                    public void postProcess(File file, Path path){
                        try{
                            if(!file.delete())
                                throw new IOException("couldn't delete file :"+file);
                        }catch(IOException ex){
                            throw new RuntimeException(ex);
                        }
                    }
                });
            }catch(RuntimeException ex){
                if(ex.getCause() instanceof IOException)
                    throw (IOException)ex.getCause();
                else
                    throw ex;
            }
        }
    }

    public static void deleteEmptyDirs(File directory) throws IOException{
        if(directory.isFile())
            return;
        Walker walker = new PreorderWalker(directory, new FileNavigator(new FileFilter(){
            @Override
            public boolean accept(File file){
                return file.isDirectory();
            }
        }));
        try{
            WalkerUtil.walk(walker, new Processor(){
                @Override
                public boolean preProcess(File file, Path path){
                    return true;
                }

                @Override
                public void postProcess(File file, Path path){
                    try{
                        if(file.list().length==0)
                            delete(file);
                    }catch(IOException ex){
                        throw new RuntimeException(ex);
                    }
                }
            });
        }catch(RuntimeException ex){
            if(ex.getCause() instanceof IOException)
                throw (IOException)ex.getCause();
            else
                throw ex;
        }
    }

    /*-------------------------------------------------[ MkDir ]---------------------------------------------------*/

    /**
     * create specified directory if doesn't exist.
     */
    public static void mkdir(File dir) throws IOException{
        if(!dir.exists() && !dir.mkdir())
            throw new IOException("couldn't create directory: "+dir);
    }

    /**
     * create specified directory if doesn't exist.
     * if any parent diretories doesn't exist they will
     * be created implicitly
     */
    public static void mkdirs(File dir) throws IOException{
        if(!dir.exists() && !dir.mkdirs())
            throw new IOException("couldn't create directory: "+dir);
    }

    /*-------------------------------------------------[ Copy ]---------------------------------------------------*/

    public static interface FileCreator{
        public void createFile(File sourceFile, File targetFile) throws IOException;
        public String translate(String name);
    }

    private static final FileCreator CREATOR = new FileCreator(){
        public void createFile(File sourceFile, File targetFile) throws IOException{
            mkdirs(targetFile.getParentFile());
            IOUtil.pump(new FileInputStream(sourceFile), new FileOutputStream(targetFile), true, true);
        }

        public String translate(String name){
            return name;
        }
    };

    public static void copyInto(File source, final File targetDir) throws IOException{
        copyInto(source, targetDir, CREATOR);
    }

    public static void copy(File source, final File target) throws IOException{
        copy(source, target, CREATOR);
    }

    public static void copyInto(File source, File targetDir, FileCreator creator) throws IOException{
        File target = new File(targetDir,creator.translate(source.getName()));
        copy(source, target, creator);
    }

    public static void copy(File source, final File target, final FileCreator creator) throws IOException{
        if(source.isFile())
            creator.createFile(source, target);
        else{
            try{
                mkdirs(target);

                Walker walker = new PreorderWalker(source, FileNavigator.INSTANCE);
                walker.next();
                final Stack stack = new Stack();
                stack.push(target);
                WalkerUtil.walk(walker, new Processor(){
                    @Override
                    public boolean preProcess(File source, Path path){
                        File result = stack.peek();
                        result = new File(result, creator.translate(source.getName()));
                        stack.push(result);
                        try{
                            if(source.isDirectory())
                                mkdirs(result);
                            else
                                creator.createFile(source, result);
                        }catch(IOException ex){
                            throw new RuntimeException(ex);
                        }
                        return true;
                    }

                    @Override
                    public void postProcess(File source, Path path){
                        stack.pop();
                    }
                });
            }catch(IOException ex){
                if(ex.getCause() instanceof IOException)
                    throw (IOException)ex.getCause();
                else
                    throw ex;
            }
        }
    }

    public static void main(String[] args) throws IOException{
        copyInto(new File("/Users/santhosh/Downloads/xml-schemas"), new File("/Users/santhosh/Downloads/Incomplete"));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy