Index: lutinutil/src/java/org/codelutin/util/FileUtil.java diff -u lutinutil/src/java/org/codelutin/util/FileUtil.java:1.16 lutinutil/src/java/org/codelutin/util/FileUtil.java:1.17 --- lutinutil/src/java/org/codelutin/util/FileUtil.java:1.16 Thu Oct 12 21:22:24 2006 +++ lutinutil/src/java/org/codelutin/util/FileUtil.java Mon Jan 8 13:18:35 2007 @@ -23,22 +23,27 @@ * Created: 22 nov. 2004 * * @author Benjamin Poussin - * @version $Revision: 1.16 $ + * @version $Revision: 1.17 $ * - * Mise a jour: $Date: 2006/10/12 21:22:24 $ + * Mise a jour: $Date: 2007/01/08 13:18:35 $ * par : $Author: bpoussin $ */ package org.codelutin.util; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.channels.FileChannel; import java.util.ArrayList; @@ -174,6 +179,55 @@ return null; } + /** + * Permet de convertir un fichier en un tableau de byte + * + * @param file + * @return + * @throws IOException + */ + static public byte[] fileToByte(File file) throws IOException { + InputStream in = new BufferedInputStream(new FileInputStream(file)); + ByteArrayOutputStream result = new ByteArrayOutputStream(); + BufferedOutputStream tmp = new BufferedOutputStream(result); + for (int b=in.read(); b != -1; b=in.read()) { + tmp.write(b); + } + in.close(); + tmp.close(); + + return result.toByteArray(); + } + + /** + * Permet de convertir des bytes en fichier, le fichier sera automatiquement + * supprimé a la fin de la JVM. + * + * @param bytes + * @return le fichier temporaire contenant les bytes + * @throws IOException + */ + static public File byteToFile(byte[] bytes) throws IOException { + File file = File.createTempFile("FileUtil-byteToFile", ".tmp"); + byteToFile(bytes, file); + return file; + } + + /** + * Permet de convertir des bytes en fichier + * + * @param bytes + * @param file le fichier dans lequel il faut ecrire les bytes + * @return le fichier passé en parametre + * @throws IOException + */ + static public File byteToFile(byte[] bytes, File file) throws IOException { + OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); + out.write(bytes); + out.close(); + return file; + } + /** * Retourne un Reader utilisant l'encoding par defaut {@link #ENCODING} * @@ -387,7 +441,7 @@ return f.isDirectory(); } } - return getFilteredElements(directory, new DirectoryFilter()); + return getFilteredElements(directory, new DirectoryFilter(), true); } /** @@ -403,19 +457,19 @@ return f.isFile(); } } - return getFilteredElements(directory, new NormalFileFilter()); + return getFilteredElements(directory, new NormalFileFilter(), true); } /** * Retourne les fichiers d'un répertoire qui s'attisfont un certain pattern. - * La recherche est faire récursivement dans les sous répertoires + * La recherche est faite récursivement dans les sous répertoires * @param directory le répertoire à partir duquel il faut faire la recherche * @param pattern le pattern que doit respecter le fichier pour être dans la * liste résultante * @return une liste d'objet {@link java.io.File} qui ont s'attisfait le * pattern. */ - public static List find(File directory, final String pattern){ + public static List find(File directory, final String pattern, boolean recursively){ final String root = directory.getAbsolutePath(); final int rootLength = root.length(); @@ -426,7 +480,7 @@ String filename = longFilename.substring(rootLength + 1); return filename.matches(pattern); } - }); + }, recursively); } /** @@ -437,7 +491,7 @@ * être conservé dans les résultats, ou null pour tous les fichiers * @return une liste d'objet {@link java.io.File}, qui s'attisfont le filtre */ - public static List getFilteredElements(File directory, FileFilter ff) { + public static List getFilteredElements(File directory, FileFilter ff, boolean recursively) { ArrayList result = new ArrayList(); LinkedList todo = new LinkedList(); if (directory.isDirectory()){ @@ -445,7 +499,7 @@ } while(todo.size() > 0){ File file = todo.removeFirst(); - if (file.isDirectory()){ + if (recursively && file.isDirectory()){ File [] childs = file.listFiles(); if (childs != null) { // null if we don't have access to directory todo.addAll(Arrays.asList(childs)); @@ -563,12 +617,41 @@ * @throws IOException */ static public void copyRecursively(File srcDir, File destDir, String ... includePatterns) throws IOException { + copyAndRenameRecursively(srcDir, destDir, null, null, includePatterns); + } + + /** + * Copie recursivement le repertoire source dans le repertoire destination + * + * copyRecursively("/truc/titi", "/var/tmp", "bidulle") donnera le repertoire + * "/var/tmp/bidulle", 'bidulle' remplacant 'titi' + * + * @param srcDir + * @param destDir + * @param renameFrom pattern to permit rename file before uncompress it + * @param renameTo new name for file if renameFrom is applicable to it + * you can use $1, $2, ... if you have '(' ')' in renameFrom + * @param includePatterns les patterns que doivent resperter les + * fichiers/repertoires pour etre copié. Si vide alors tout est copié + * + * @throws IOException + */ + static public void copyAndRenameRecursively(File srcDir, File destDir, + String renameFrom, String renameTo, String ... includePatterns) throws IOException { String rootSrc = srcDir.getParent(); - List files = getFilteredElements(srcDir, null); + List files = getFilteredElements(srcDir, null, true); log.debug("copyRecursively: " + files); for (File file : files) { if (copyRecursivelyAccept(file, includePatterns)) { String path = file.getPath().substring(rootSrc.length()); + if (renameFrom != null && renameTo != null) { + String tmp = path.replaceAll(renameFrom, renameTo); + if (log.isDebugEnabled()) { + log.debug("rename " + path + " -> " + tmp); + } + path = tmp; + } + File destFile = new File(destDir, path); if (file.isDirectory()) { log.debug("create directory: " + destFile);