Java tutorial
/* * **************************************************- * ingrid-iplug-csw-dsc:war * ================================================== * Copyright (C) 2014 - 2019 wemove digital solutions GmbH * ================================================== * Licensed under the EUPL, Version 1.1 or as soon they will be * approved by the European Commission - subsequent versions of the * EUPL (the "Licence"); * * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl5 * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * **************************************************# */ /* * Copyright (c) 2009 wemove digital solutions. All rights reserved. */ package de.ingrid.iplug.csw.dsc.tools; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class FileUtils { final protected static Log log = LogFactory.getLog(FileUtils.class); /** * Remove all files from a directory and all sub directories * @param src The start directory */ public static void deleteRecursive(File src) { File[] files = src.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { File file = files[i]; if (file.isDirectory()) { deleteRecursive(file); } file.delete(); } } src.delete(); } /** * This function will copy files or directories from one location to another. * note that the source and the destination must be mutually exclusive. This * function can not be used to copy a directory to a sub directory of itself. * The function will also have problems if the destination files already exist. * @param src -- A File object that represents the source for the copy * @param dest -- A File object that represnts the destination for the copy. * @throws IOException if unable to copy. * * Source: http://www.dreamincode.net/code/snippet1443.htm */ public static void copyRecursive(File src, File dest) throws IOException { //Check to ensure that the source is valid... if (!src.exists()) { throw new IOException("copyFiles: Can not find source: " + src.getAbsolutePath() + "."); } else if (!src.canRead()) { //check to ensure we have rights to the source... throw new IOException("copyFiles: No right to source: " + src.getAbsolutePath() + "."); } //is this a directory copy? if (src.isDirectory()) { if (!dest.exists()) { //does the destination already exist? //if not we need to make it exist if possible (note this is mkdirs not mkdir) if (!dest.mkdirs()) { throw new IOException("copyFiles: Could not create direcotry: " + dest.getAbsolutePath() + "."); } } //get a listing of files... String list[] = src.list(); //copy all the files in the list. for (int i = 0; i < list.length; i++) { File dest1 = new File(dest, list[i]); File src1 = new File(src, list[i]); copyRecursive(src1, dest1); } } else { //This was not a directory, so lets just copy the file FileInputStream fin = null; FileOutputStream fout = null; byte[] buffer = new byte[4096]; //Buffer 4K at a time (you can change this). int bytesRead; try { //open the files for input and output fin = new FileInputStream(src); fout = new FileOutputStream(dest); //while bytesRead indicates a successful read, lets write... while ((bytesRead = fin.read(buffer)) >= 0) { fout.write(buffer, 0, bytesRead); } fin.close(); fout.close(); fin = null; fout = null; } catch (IOException e) { //Error copying file... IOException wrapper = new IOException("copyFiles: Unable to copy file: " + src.getAbsolutePath() + "to" + dest.getAbsolutePath() + "."); wrapper.initCause(e); wrapper.setStackTrace(e.getStackTrace()); throw wrapper; } finally { //Ensure that the files are closed (if they were open). if (fin != null) { fin.close(); } if (fout != null) { fin.close(); } } } } /** * Encode Filename to prevent invalid characters in file name. The encoding * is reversible (url encoding (UTF-8) is used). * * @param s * @return */ public static String encodeFileName(String s) { try { return URLEncoder.encode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { log.error("Unable to encode using UTF-8.", e); return s; } } /** * Decode Filename coded with <code>encodeFileName</code>. * * @param s * @return */ public static String decodeFileName(String s) { try { return URLDecoder.decode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { log.error("Unable to decode using UTF-8.", e); return s; } } }