/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.apps.tool.file;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class FileTool {
private static final Logger LOG = LoggerFactory.getLogger(FileTool.class);
private FileTool(){
}
/**
* Méthode permettant de lire le contenu d'un fichier
*
* @param fileName
* Le nom du fichier
* @return
* Une liste contenant l'ensemble des lignes
* @throws IOException
* @throws AxelorException
*/
public static List<String> reader(String fileName) throws IOException {
List<String> content = new ArrayList<String>();
BufferedReader br = new BufferedReader(new FileReader(new File(fileName)));
String ligne = "";
while ((ligne = br.readLine()) != null) {
content.add(ligne);
}
br.close();
return content;
}
/**
* Méthode permettant d'écrire une ligne dans un fichier
* @param destinationFolder
* Le chemin du fichier
* @param fileName
* Le nom du fichier
* @param line
* La ligne à écrire
* @throws IOException
*/
public static void writer(String destinationFolder, String fileName, String line) throws IOException {
System.setProperty("line.separator", "\r\n");
FileWriter writer = null;
try {
File file = create(destinationFolder, fileName);
writer = new FileWriter(file);
writer.write(line);
}
catch(IOException ex) {
LOG.error(ex.getMessage());
}
finally {
if(writer != null) { writer.close(); }
}
}
/**
* Méthode permettant d'écrire plusieurs lignes dans un fichier
* @param destinationFolder
* Le chemin du fichier
* @param fileName
* Le nom du fichier
* @param line
* La liste de ligne à écrire
* @throws IOException
*/
public static void writer(String destinationFolder, String fileName, List<String> multiLine) throws IOException {
System.setProperty("line.separator", "\r\n");
BufferedWriter output = null;
try {
File file = create(destinationFolder, fileName);
output = new BufferedWriter(new FileWriter(file));
int i = 0;
for (String line : multiLine) {
output.write(line);
output.newLine();
i++;
if (i % 50 == 0){ output.flush(); }
}
}
catch(IOException ex) {
LOG.error(ex.getMessage());
}
finally {
if(output != null) { output.close(); }
}
}
/**
* Création d'un fichier avec son chemin si il n'existe pas
*
* @param fileName
* @return
* @throws IOException
*/
public static File create(String fileName) throws IOException{
String[] filePath = fileName.split(System.getProperty("file.separator"));
String name = filePath[filePath.length - 1];
return create(fileName.replace(name, ""), name);
}
/**
* Création d'un fichier avec son chemin si il n'existe pas
*
* @param destinationFolder
* @param fileName
* @return
* @throws IOException
*/
public static File create(String destinationFolder, String fileName) throws IOException {
File folder = new File(destinationFolder);
if (!folder.exists()) { folder.mkdirs(); }
return new File(folder, fileName);
}
/**
* Méthode permettant de copier le fichier vers une destination
*
* @param fileSrc
* Le chemin du fichier source
* @param fileDest
* Le chemin du fichier destination
* @throws IOException
* @throws FileNotFoundException
* @throws AxelorException
*/
public static void copy(String fileSrc, String fileDest) throws IOException {
IOUtils.copy(new FileInputStream(fileSrc), new FileOutputStream(fileDest));
}
/**
* Copy all files and directories from a Folder to a destination Folder.
* Must be called like: listAllFilesInFolder(srcFolderPath, "", srcFolderPath,
* destFolderPath)
*
* @param currentFolder Used for the recursive called.
* @param relatedPath Used for the recursive called.
* @param sourceFolder Source directory.
* @param destinationFolder Destination directory.
* @param logger A logger.
* @throws IOException
*/
public static void copyFolderToFolder(String sourceFolder, String destinationFolder) throws IOException {
// Current Directory.
File current = new File(sourceFolder);
File destFile = new File(destinationFolder);
if (!destFile.exists()) { destFile.mkdir(); }
if (current.isDirectory()) {
// List all files and folder in the current directory.
File[] list = current.listFiles();
if (list != null) {
// Read the files list.
for (int i = 0; i < list.length; i++) {
// Create current source File
File tf = new File(sourceFolder + "/" + list[i].getName());
// Create current destination File
File pf = new File(destinationFolder + "/" + list[i].getName());
if (tf.isDirectory() && !pf.exists()) {
// If the file is a directory and does not exit in the
// destination Folder.
// Create the directory.
pf.mkdir();
copyFolderToFolder(tf.getAbsolutePath(), pf.getAbsolutePath());
} else if (tf.isDirectory() && pf.exists()) {
// If the file is a directory and exits in the
// destination Folder.
copyFolderToFolder(tf.getAbsolutePath(), pf.getAbsolutePath());
} else if (tf.isFile()) {
// If it is a file.
copy(sourceFolder + "/" + list[i].getName(), destinationFolder + "/" + list[i].getName());
} else {
// Other cases.
LOG.error("Error : Copy folder");
}
}
}
}
}
}