/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.core.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.xmind.core.CoreException; import org.xmind.core.IFileEntryFilter; import org.xmind.core.io.IInputSource; import org.xmind.core.io.IOutputTarget; import org.xmind.core.io.IStorage; /** * @author briansun * */ public class FileUtils { /** * @param f * @return */ public static File ensureFileParent(File f) { ensureDirectory(f.getParentFile()); return f; } /** * @param dir * @return */ public static File ensureDirectory(File dir) { if (!dir.exists()) dir.mkdirs(); return dir; } public static void copy(String src, String dest) throws IOException { FileInputStream is = new FileInputStream(src); FileOutputStream os = new FileOutputStream(dest); transfer(is, os, true); } public static void copy(File src, File dest) throws IOException { FileInputStream is = new FileInputStream(src); FileOutputStream os = new FileOutputStream(dest); transfer(is, os, true); } public static void transfer(IStorage oldStorage, IStorage newStorage) throws IOException, CoreException { transfer(oldStorage, newStorage, null); } public static void transfer(IStorage oldStorage, IStorage newStorage, IFileEntryFilter filter) throws IOException, CoreException { IInputSource inSource = oldStorage.getInputSource(); IOutputTarget outTarget = newStorage.getOutputTarget(); transfer(inSource, outTarget, filter); } public static void transfer(IInputSource inputSource, IOutputTarget outputTarget) throws IOException { transfer(inputSource, outputTarget, null); } public static void transfer(IInputSource inputSource, IOutputTarget outputTarget, IFileEntryFilter filter) throws IOException { Iterator<String> entries = inputSource.getEntries(); while (entries.hasNext()) { String entryPath = entries.next(); if ((filter == null || filter.select(entryPath, null, false))) { if (inputSource.hasEntry(entryPath) && inputSource.isEntryAvailable(entryPath)) { InputStream is = inputSource.openEntryStream(entryPath); try { OutputStream os = outputTarget .openEntryStream(entryPath); try { transfer(is, os); } finally { os.close(); } } finally { is.close(); } } } } } public static void transfer(IInputSource source, String sourcePath, IOutputTarget target, String targetPath) throws IOException { InputStream input = source.openEntryStream(sourcePath); try { OutputStream output = target.openEntryStream(targetPath); try { transfer(input, output, false); } finally { output.close(); } } finally { input.close(); } } public static void transfer(InputStream is, OutputStream os) throws IOException { transfer(is, os, true, null); } public static void transfer(InputStream is, OutputStream os, boolean closeOnFinish) throws IOException { transfer(is, os, closeOnFinish, null); } public static void transfer(InputStream is, OutputStream os, boolean closeOnFinish, String taskName) throws IOException { try { byte[] buffer = new byte[4096]; int numRead; while ((numRead = is.read(buffer)) != -1) { os.write(buffer, 0, numRead); } } finally { if (closeOnFinish) { try { is.close(); } finally { os.close(); } } } } public static void transfer(File source, File target) throws IOException { ensureFileParent(target); InputStream in = new FileInputStream(source); try { OutputStream out = new FileOutputStream(target); try { transfer(in, out, false); } finally { out.close(); } } finally { in.close(); } } /** * Deletes the given file and, if it is a directory, delete all its * sub-directories and sub-files. * * @param f * The file or directory to delete * @return Whether the given file or directory is successfully deleted. */ public static boolean delete(File f) { if (f.isFile()) return f.delete(); else if (f.isDirectory()) { boolean b = clearDir(f); b &= f.delete(); return b; } else return false; } /** * Deletes all sub-files and sub-directories in the given directory. * * @param dir * The directory to clear * @return Whether the given directory is successfully cleared. */ public static boolean clearDir(File dir) { if (!dir.isDirectory()) return false; File[] files = dir.listFiles(); if (files == null || files.length == 0) return true; boolean cleared = true; for (File sub : files) { cleared &= delete(sub); } return cleared; } /** * Determines corresponding media type of the given path. * * @param path * @return */ public static String getMediaType(String path) { if (path != null) { String ext = getExtension(path); if (".jpg".equals(ext) || ".jpeg".equals(ext)) //$NON-NLS-1$ //$NON-NLS-2$ return "image/jpeg"; //$NON-NLS-1$ if (".png".equals(ext)) //$NON-NLS-1$ return "image/png"; //$NON-NLS-1$ if (".bmp".equals(ext)) //$NON-NLS-1$ return "image/bmp"; //$NON-NLS-1$ if (".gif".equals(ext)) //$NON-NLS-1$ return "image/gif"; //$NON-NLS-1$ } return ""; //$NON-NLS-1$ } private static Pattern FileNamePattern = null; public static String getFileName(String fullPath) { if (FileNamePattern == null) FileNamePattern = Pattern.compile("([^/\\\\]*)[/|\\\\]?$"); //$NON-NLS-1$ Matcher m = FileNamePattern.matcher(fullPath); if (m.find()) return m.group(1); return fullPath; } /** * Returns the extension part of a file path, e.g., <code>.jpg</code>, * <code>.html</code>. If the file does not have an extension, an empty * string is returned. * * @param fullPath * @return */ public static String getExtension(String fullPath) { String fileName = getFileName(fullPath); int i = fileName.lastIndexOf('.'); if (i >= 0) return fileName.substring(i); return ""; //$NON-NLS-1$ } public static String getNoExtensionFileName(String fullPath) { String fileName = getFileName(fullPath); int i = fileName.lastIndexOf('.'); if (i >= 0) return fileName.substring(0, i); return fileName; } public static void extractZipFile(String filename, IOutputTarget target) throws IOException { extractZipFile(filename, target, null); } public static void extractZipFile(String filename, IOutputTarget target, IFileEntryFilter filter) throws IOException { FileInputStream fin = new FileInputStream(filename); try { ZipInputStream zin = new ZipInputStream( new BufferedInputStream(fin)); try { extractZipFile(zin, target, filter); } finally { zin.close(); } } finally { fin.close(); } } public static void extractZipFile(File file, IOutputTarget target) throws IOException { extractZipFile(file, target, null); } public static void extractZipFile(File file, IOutputTarget target, IFileEntryFilter filter) throws IOException { FileInputStream fin = new FileInputStream(file); try { ZipInputStream zin = new ZipInputStream( new BufferedInputStream(fin)); try { extractZipFile(zin, target, filter); } finally { zin.close(); } } finally { fin.close(); } } public static void extractZipFile(ZipInputStream zin, IOutputTarget target) throws IOException { extractZipFile(zin, target, null); } public static void extractZipFile(ZipInputStream zin, IOutputTarget target, IFileEntryFilter filter) throws IOException { ZipEntry entry; while ((entry = zin.getNextEntry()) != null) { String entryPath = entry.getName(); if (!entry.isDirectory() && (filter == null || filter.select(entryPath, null, false))) { if (target.isEntryAvaialble(entryPath)) { OutputStream out = target.openEntryStream(entryPath); try { FileUtils.transfer(zin, out, false); } finally { try { out.close(); } catch (IOException ignore) { } } } } } } public static void extractZipStream(InputStream stream, IOutputTarget target) throws IOException { extractZipStream(stream, target, null); } public static void extractZipStream(InputStream stream, IOutputTarget target, IFileEntryFilter filter) throws IOException { extractZipFile(new ZipInputStream(stream), target, filter); } }