/* * Copyright (C) 2008-2015 by Holger Arndt * * This file is part of the Universal Java Matrix Package (UJMP). * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * UJMP is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * UJMP 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with UJMP; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package org.ujmp.core.util.io; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.ujmp.core.filematrix.FileFormat; import org.ujmp.core.listmatrix.DefaultListMatrix; import org.ujmp.core.listmatrix.ListMatrix; import org.ujmp.core.util.MathUtil; import org.ujmp.core.util.VerifyUtil; public class FileUtil { public static FileFormat guessFormat(File file) { String filename = file.getAbsolutePath(); String[] components = filename.split("\\."); String suffix = components[components.length - 1]; if (suffix.equalsIgnoreCase("gz") || suffix.equalsIgnoreCase("z") || suffix.equalsIgnoreCase("gzip") || suffix.equalsIgnoreCase(".zip") || suffix.equalsIgnoreCase(".7zip") || suffix.equalsIgnoreCase(".7z")) { suffix = components[components.length - 2]; } for (FileFormat f : FileFormat.values()) { if (suffix.equalsIgnoreCase(f.name())) { return f; } } throw new RuntimeException("could not guess file format: " + suffix); } public static boolean deleteRecursive(File path) { if (path != null && path.exists() && path.isDirectory()) { File[] files = path.listFiles(); for (File f : files) { if (f.isDirectory()) { deleteRecursive(f); } else { f.delete(); } } } if (path != null) { boolean successful = path.delete(); return successful; } else { return false; } } public static List<File> getAll(File path) { List<File> all = new ArrayList<File>(); if (path != null && path.exists()) { File[] files = path.listFiles(); for (File f : files) { if (f.isDirectory()) { all.addAll(getAll(f)); } else { all.add(f); } } } return all; } public static boolean equalsContent(File file1, File file2) throws IOException { VerifyUtil.verifyNotNull(file1, "file1 is null"); VerifyUtil.verifyNotNull(file2, "file2 is null"); VerifyUtil.verifyTrue(file1.exists(), "file1 does not exist"); VerifyUtil.verifyTrue(file2.exists(), "file2 does not exist"); VerifyUtil.verifyTrue(file1.canRead(), "cannot read file1"); VerifyUtil.verifyTrue(file2.canRead(), "cannot read file2"); if (file1.length() != file2.length()) { return false; } final int bufferSize = 8192; final byte[] data1 = new byte[bufferSize]; final byte[] data2 = new byte[bufferSize]; boolean areEqual = true; BufferedInputStream in1 = new BufferedInputStream(new FileInputStream(file1)); BufferedInputStream in2 = new BufferedInputStream(new FileInputStream(file2)); while (true) { int length1 = in1.read(data1, 0, bufferSize); int length2 = in2.read(data2, 0, bufferSize); if (length1 != length2) { areEqual = false; break; } if (!Arrays.equals(data1, data2)) { areEqual = false; break; } if (length1 < bufferSize) { break; } } in1.close(); in2.close(); return areEqual; } public static boolean move(File source, File target) { VerifyUtil.verifyNotNull(source, "source file is null"); VerifyUtil.verifyNotNull(target, "target file is null"); VerifyUtil.verifyTrue(source.canRead(), "cannot read source file"); VerifyUtil.verifyTrue(source.exists(), "source file does not exist"); VerifyUtil.verifyFalse(target.exists(), "target file exists"); return source.renameTo(target); } public static String loadToString(File file) { return IntelligentFileReader.load(file); } public static byte[] getBytes(File file) { return IntelligentFileReader.readBytes(file); } public static void copyFile(File source, File target) throws IOException { VerifyUtil.verifyNotNull(source, "source file is null"); VerifyUtil.verifyNotNull(target, "target file is null"); VerifyUtil.verifyTrue(source.canRead(), "cannot read source file"); VerifyUtil.verifyTrue(source.exists(), "source file does not exist"); VerifyUtil.verifyFalse(target.exists(), "target file exists"); final FileInputStream fis = new FileInputStream(source); final FileOutputStream fos = new FileOutputStream(target); final FileChannel inChannel = fis.getChannel(); final FileChannel outChannel = fos.getChannel(); final long maxCount = 67076096; final long size = inChannel.size(); long position = 0; try { while (position < size) { position += inChannel.transferTo(position, maxCount, outChannel); } } catch (IOException e) { throw e; } finally { if (inChannel != null) { inChannel.close(); } if (outChannel != null) { outChannel.close(); } if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } } public static String md5Sum(File file) throws NoSuchAlgorithmException, IOException { return MathUtil.md5(file); } public static List<List<File>> findDuplicates(File path) throws Exception { return findDuplicates(path, new HashMap<String, List<File>>()); } private static List<List<File>> findDuplicates(File path, Map<String, List<File>> md5Map) throws Exception { List<List<File>> list = new ArrayList<List<File>>(); File[] files = path.listFiles(); for (File file : files) { if (file.isDirectory()) { List<List<File>> subDirList = findDuplicates(file); list.addAll(subDirList); } else { System.out.print(file); String md5 = md5Sum(file); System.out.println(" [" + md5 + "]"); List<File> similarFiles = md5Map.get(md5); if (similarFiles == null) { similarFiles = new LinkedList<File>(); md5Map.put(md5, similarFiles); } if (!similarFiles.isEmpty()) { System.out.println(" " + similarFiles.size() + " files with same md5"); for (File similarFile : similarFiles) { if (equalsContent(file, similarFile)) { System.out.println(" match found: " + similarFile); List<File> set = new LinkedList<File>(); set.add(file); set.add(similarFile); list.add(set); } } } similarFiles.add(file); } } return list; } public static int countFiles(File path) { int count = 0; File[] files = path.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { count += countFiles(f); } else { count++; } } } return count; } public static ListMatrix<File> listRecursive(File path) { ListMatrix<File> list = new DefaultListMatrix<File>(); File[] files = path.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { list.addAll(listRecursive(f)); } else { list.add(f); } } } return list; } public static final File appendExtension(File file, String newExtension) { String name = file.getAbsolutePath().concat(newExtension); return new File(name); } }