/** * OrbisGIS is a java GIS application dedicated to research in GIScience. * OrbisGIS is developed by the GIS group of the DECIDE team of the * Lab-STICC CNRS laboratory, see <http://www.lab-sticc.fr/>. * * The GIS group of the DECIDE team is located at : * * Laboratoire Lab-STICC – CNRS UMR 6285 * Equipe DECIDE * UNIVERSITÉ DE BRETAGNE-SUD * Institut Universitaire de Technologie de Vannes * 8, Rue Montaigne - BP 561 56017 Vannes Cedex * * OrbisGIS is distributed under GPL 3 license. * * Copyright (C) 2007-2014 CNRS (IRSTV FR CNRS 2488) * Copyright (C) 2015-2017 CNRS (Lab-STICC UMR CNRS 6285) * * This file is part of OrbisGIS. * * OrbisGIS is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * OrbisGIS is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * OrbisGIS. If not, see <http://www.gnu.org/licenses/>. * * For more information, please consult: <http://www.orbisgis.org/> * or contact directly: * info_at_ orbisgis.org */ package org.orbisgis.commons.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import org.apache.commons.io.FilenameUtils; /** * Contains some utility functions for dealing with files. */ public final class FileUtils { private static final int BUF_SIZE = 1024 * 64; private static final String TABLE_PARAM = "tablename="; private static final String TABLE_PARAM_JDBC = "table="; /** * Copies the specified folder in the destination folder * * @param sourceDir * @param destDir * @throws IOException * @deprecated use {@link org.apache.commons.io.FileUtils#copyDirectory(java.io.File, java.io.File) } */ @Deprecated public static void copyDirsRecursively(File sourceDir, File destDir) throws IOException { File[] sourceChildren = sourceDir.listFiles(); for (File file : sourceChildren) { if (file.isDirectory()) { File childDir = new File(destDir, file.getName()); if (!childDir.exists() && !childDir.mkdirs()) { throw new IOException("Cannot create: " + childDir); } copyDirsRecursively(file, childDir); } else { copyFileToDirectory(file, destDir); } } } /** * Deletes a file if exists * * @param file * @return true iif the file vas deleted * @deprecated use {@link File#delete() } this method adds nothing to it */ @Deprecated public static boolean deleteFile(File file) { if (file != null && file.exists()) { return file.delete(); } return false; } /** * A simple method to delete all shape files : dbf, shp, shx, prj. * * @param fileShp * @throws IOException */ public static void deleteSHPFiles(File fileShp) throws IOException { File fileShx = getFileWithExtension(fileShp, "shx"); File fileDbf = getFileWithExtension(fileShp, "dbf"); File filePrj = getFileWithExtension(fileShp, "prj"); fileShp.delete(); fileShx.delete(); fileDbf.delete(); filePrj.delete(); } /** * Delete all the files in the directory. * This method takes care to remove all the files in the child directories * (recursively) before removing the directories. * This method does not remove the parameter File dir. * @param dir * @return * false is a problem is encountered, true otherwise * @deprecated use {@link org.apache.commons.io.FileUtils#cleanDirectory(java.io.File) } */ @Deprecated public static boolean deleteFileInDir(File dir) { if (dir.isDirectory()) { // we iterate over the children String[] children = dir.list(); for (int i = 0; i < children.length; i++) { final File file = new File(dir, children[i]); // we try to delete the inner files/dirs if (deleteFileInDir(file)) { // then we try to delete the file/folder // it it was a file, it does not exist anymore // else (directory) we delete it if (file.exists() && !file.delete()) { // failed to delete the file/folder return false; } } else { // failed to delete the inner files/dirs return false; } } } else { // it is a file, let's delete it if (!dir.delete()) { // failed to delete the file return false; } } // everything happened ok. return true; } /** * Delete a directory and its contents * @param dir * @return * true if successful, false otherwise. * @deprecated use {@link org.apache.commons.io.FileUtils#deleteDirectory(java.io.File) } */ @Deprecated public static boolean deleteDir(File dir) { return deleteFileInDir(dir) && dir.delete(); } /** * Copy file in the directory destDir. If destDir doesn't exist, it will be created. * @param file * The file to be copied * @param destDir * the destination directory. * @throws IOException * If destDir does not exist and can't be created. * @deprecated use {@link org.apache.commons.io.FileUtils#copyFileToDirectory(java.io.File, java.io.File) } */ @Deprecated public static void copyFileToDirectory(File file, File destDir) throws IOException { if (!destDir.exists() && !destDir.mkdirs()) { throw new IOException("Cannot create directory: " + destDir); } File output = new File(destDir, file.getName()); copy(file, output); } /** * Copy the content of input in output. * @param input * @param output * @return * @throws IOException * If there is a problem while copying the file. * @deprecated use {@link org.apache.commons.io.FileUtils#copyFile(java.io.File, java.io.File) } * or one of the {@link org.apache.commons.io.IOUtils#copy(java.io.InputStream, java.io.OutputStream) } * methods. */ @Deprecated public static long copy(File input, File output) throws IOException { FileInputStream in = null; try { in = new FileInputStream(input); return copy(in, output); } finally { if (in != null) { in.close(); } } } /** * Copy input into output, using a given Buffer to transmit the data. * @param input * @param output * @param copyBuffer * @return * @throws IOException * If a problem is encountered during the copy. * @deprecated use {@link org.apache.commons.io.FileUtils#copyFile(java.io.File, java.io.File) } * or one of the {@link org.apache.commons.io.IOUtils#copy(java.io.InputStream, java.io.OutputStream) } * methods. */ @Deprecated public static long copy(File input, File output, byte[] copyBuffer) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { try { in = new FileInputStream(input); out = new FileOutputStream(output); return copy(in, out, copyBuffer); } finally { if (in != null) { in.close(); } } } finally { if (out != null) { out.close(); } } } /** * Copy the content of in in the outputFile. * @param in * @param outputFile * @return * @throws IOException * If a probem is encountered during the copy. * @deprecated use {@link org.apache.commons.io.FileUtils#copyFile(java.io.File, java.io.File) } * or one of the {@link org.apache.commons.io.IOUtils#copy(java.io.InputStream, java.io.OutputStream) } * methods. */ @Deprecated public static long copy(InputStream in, File outputFile) throws IOException { FileOutputStream out = null; try { out = new FileOutputStream(outputFile); return copy(in, out); } finally { if (out != null) { out.close(); } } } /** * Copy the stream in to the stream out * @param in * @param out * @return * @throws IOException * If a problem is encountered during the copy. * @deprecated use {@link org.apache.commons.io.FileUtils#copyFile(java.io.File, java.io.File) } * or one of the {@link org.apache.commons.io.IOUtils#copy(java.io.InputStream, java.io.OutputStream) } * methods. */ @Deprecated public static long copy(InputStream in, OutputStream out) throws IOException { byte[] buf = new byte[BUF_SIZE]; return copy(in, out, buf); } /** * Copy the stream in to the stream out, given an intermediate copy buffer * @param in * @param out * @param copyBuffer * @return * @throws IOException * If a problem is encountered during the copy. * @deprecated use {@link org.apache.commons.io.FileUtils#copyFile(java.io.File, java.io.File) } * or one of the {@link org.apache.commons.io.IOUtils#copy(java.io.InputStream, java.io.OutputStream) } * methods. */ @Deprecated public static long copy(InputStream in, OutputStream out, byte[] copyBuffer) throws IOException { long bytesCopied = 0; int read = in.read(copyBuffer, 0, copyBuffer.length); while (read != -1) { out.write(copyBuffer, 0, read); bytesCopied += read; read = in.read(copyBuffer, 0, copyBuffer.length); } return bytesCopied; } /** * Retrieve a file pointed by url, store it in file. * @param url * @param file * @throws IOException * If a problem is encountered while downloading the file. * @deprecated use {@link org.apache.commons.io.FileUtils#copyURLToFile(java.net.URL, java.io.File, int, int) } */ @Deprecated public static void download(URL url, File file) throws IOException { OutputStream out = null; InputStream in = null; try { try { out = new BufferedOutputStream(new FileOutputStream(file)); URLConnection conn = url.openConnection(); in = conn.getInputStream(); byte[] buffer = new byte[BUF_SIZE]; int numRead = in.read(buffer); while (numRead != -1) { out.write(buffer, 0, numRead); numRead = in.read(buffer); } } finally { if (in != null) { in.close(); } } } finally { if (out != null) { out.close(); } } } /** * Zips the specified file or folder * * @param toZip * @param outFile * @throws IOException */ public static void zip(File toZip, File outFile) throws IOException { ZipOutputStream out = null; try { out = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream(outFile))); byte[] data = new byte[BUF_SIZE]; ArrayList<File> listToZip = new ArrayList<File>(); listToZip.add(toZip); while (listToZip.size() > 0) { File file = listToZip.remove(0); if (file.isDirectory()) { File[] children = file.listFiles(); listToZip.addAll(Arrays.asList(children)); } else { BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(file), BUF_SIZE); out.putNextEntry(new ZipEntry(getRelativePath(toZip, file))); int count = in.read(data, 0, BUF_SIZE); while (count != -1) { out.write(data, 0, count); count = in.read(data, 0, BUF_SIZE); } out.closeEntry(); // close each entry } finally { if (in != null) { in.close(); } } } } out.flush(); } finally { if (out != null) { out.close(); } } } /** * Unzip an archive into the directory destDir. * @param zipFile * @param destDir * @throws IOException */ public static void unzip(File zipFile, File destDir) throws IOException { ZipInputStream zis = null; try { FileInputStream fis = new FileInputStream(zipFile); zis = new ZipInputStream(new BufferedInputStream(fis)); ZipEntry entry = zis.getNextEntry(); while (entry != null) { byte data[] = new byte[BUF_SIZE]; // write the files to the disk File newFile = new File(destDir, entry.getName()); File parentFile = newFile.getParentFile(); if (!parentFile.exists() && !parentFile.mkdirs()) { throw new IOException("Cannot create directory:" + parentFile); } if (!entry.isDirectory()) { BufferedOutputStream dest = null; try { FileOutputStream fos = new FileOutputStream(newFile); dest = new BufferedOutputStream(fos, BUF_SIZE); int count = zis.read(data, 0, BUF_SIZE); while (count != -1) { dest.write(data, 0, count); count = zis.read(data, 0, BUF_SIZE); } dest.flush(); } finally { if (dest != null) { dest.close(); } } } entry = zis.getNextEntry(); } } finally { if (zis != null) { zis.close(); } } } /** * get the relative path to file, according to the path to base * @param base * @param file * @return */ public static String getRelativePath(File base, File file) { String absolutePath = file.getAbsolutePath(); String path = absolutePath.substring(base.getAbsolutePath().length()); while (path.startsWith("/")) { path = path.substring(1); } return path; } /** * Retrieve the content of the file as an array of bytes. * @param file * @return * @throws IOException * @deprecated use {@link org.apache.commons.io.FileUtils#readFileToByteArray(java.io.File) } */ @Deprecated public static byte[] getContent(File file) throws IOException { FileInputStream fis = new FileInputStream(file); return getContent(fis); } /** * Retrieve the content of the Inputstream as an array of bytes. * @param fis * @return * @throws IOException * @deprecated use {@link org.apache.commons.io.IOUtils#toByteArray(java.io.InputStream) } */ @Deprecated public static byte[] getContent(InputStream fis) throws IOException { DataInputStream dis = null; byte[] buffer; try { dis = new DataInputStream(fis); buffer = new byte[dis.available()]; dis.readFully(buffer); } finally { if (dis != null) { dis.close(); } } return buffer; } /** * compute the MD5 sum of the file. * @param file * @return * @throws IOException * if there is a problem while computing the file * @throws NoSuchAlgorithmException * if the MD5 algorithm can't be found. */ public static byte[] getMD5(File file) throws IOException, NoSuchAlgorithmException { byte[] content = org.apache.commons.io.FileUtils.readFileToByteArray(file); MessageDigest m = MessageDigest.getInstance("MD5"); m.update(content, 0, content.length); return m.digest(); } /** * Transform an array of bytes to a hexadecimal String * @param messageDigest * @return * @deprecated use {@link org.apache.commons.io.HexDump } */ @Deprecated public static String toHexString(byte[] messageDigest) { StringBuilder hexString = new StringBuilder(); for (int i = 0; i < messageDigest.length; i++) { hexString.append(Integer.toHexString(0xFF & messageDigest[i])); } return hexString.toString(); } /** * Write content into file * @param file * @param content * @throws IOException * @deprecated use {@link org.apache.commons.io.FileUtils#write(java.io.File, java.lang.CharSequence) } */ @Deprecated public static void setContents(File file, String content) throws IOException { BufferedOutputStream bos = null; try { FileOutputStream fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(content.getBytes()); } finally { if (bos != null) { bos.close(); } } } /** * Get the name of a filie without its extension. * @param file * @return * @deprecated use {@link org.apache.commons.io.FilenameUtils#removeExtension(java.lang.String) } */ @Deprecated public static String getFileNameWithoutExtensionU(File file) { String name = file.getName(); int extensionStart = name.lastIndexOf('.'); String ret = name; if (extensionStart != -1) { ret = name.substring(0, name.indexOf(name.substring(extensionStart))); } return ret; } /** * Get a file according an extension * * @param file * @param extension * @return * @throws IOException */ public static File getFileWithExtension(File file, final String extension) throws IOException { if (!file.isDirectory()) { final String ret = FilenameUtils.removeExtension(file.getName()); File[] files = file.getParentFile().listFiles(new FilenameFilter() { @Override public boolean accept(File arg0, String name) { if (name.toLowerCase().endsWith(extension)) { int extensionStart = name.lastIndexOf('.'); if (extensionStart == -1) { return false; } String ret2 = name.substring(0, extensionStart); return ret2.equals(ret); } return false; } }); if (files.length > 0) { return new File(files[0].getAbsolutePath()); } else { return null; } } else { throw new IOException(file.getAbsolutePath() + " is a directory"); } } /** * Gets a convenient name from an URI. * * The URI scheme can be file or anything with a 'tablename' querystring parameter. * Anything else is unsupported. * * @param u an URI * @return a name for it * @throws UnsupportedOperationException if the URI is unsupported. */ public static String getNameFromURI(URI u) { if ("file".equalsIgnoreCase(u.getScheme())) { return FilenameUtils.removeExtension(new File(u.getPath()).getName()); } else { if("jdbc".equalsIgnoreCase(u.getScheme())) { try { u = URI.create(u.getSchemeSpecificPart()); } catch (IllegalArgumentException ex) { //Ignore } } String q = u.getQuery(); if (q != null && !q.isEmpty()) { // With & parameters String[] pat = q.split("&"); for (String aPat : pat) { if (aPat.toLowerCase().startsWith(TABLE_PARAM)) { // Extract Table name return aPat.substring(TABLE_PARAM.length()); } else if (aPat.toLowerCase().startsWith(TABLE_PARAM_JDBC)) { // Extract Table name return aPat.substring(TABLE_PARAM_JDBC.length()); } } } String path = u.getPath(); if (path != null && !path.isEmpty()) { String[] paths = path.split("/"); if(paths.length>=1) { if(!paths[paths.length-1].isEmpty()) { return paths[paths.length-1]; } } } } throw new UnsupportedOperationException(); } private FileUtils() { } }