IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[Zip] Arboresence de fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut [Zip] Arboresence de fichier
    Bonjour,

    Voila ma petite méthode, elle génére un tableau de byte[] à partir du dossier dont le chemin est passé en paramètre a zipper :

    Ma question, le chemin passé est un chemin absolu du type P:\open\commun\commun-serveur\target\test-classes\open\transformations\export

    Et mon zip est mis dans un fichier temporaire C:\Documents and Settings\moi\Local Settings\Temp

    pour ma part, je voudrai garder dans le ZIP l'arboresence open\transformations\export (du premier chemin).

    Mais je sais pas comment faire ?

    Pour le moment, je me retrouve avec une arbo C:\Documents and Settings\moi\Local Settings\Temp dans le zip (chaque arbo est un dossier).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /**
         * Retourne un tableau de byte du dossier à archiver (zip) dont le chemin est à passer en paramètre
         * @param String chemin du dossier a archiver
         * @return byte[] archive en tableau de byte
         * @throws SauvegardeBaseException 
         * @throws IOException 
         */
        public static byte[] genererArchive(String aCheminFichierAZipper) throws SauvegardeBaseException, IOException
        {
            byte[] vTableauArchiveRetour = null;
     
            //Generation du fichier zip dans un répertoire temporaire
            String vRepertoireTemporaire = System.getProperty("java.io.tmpdir");
     
            FichierArchive vFichierArchive = new FichierArchive(aCheminFichierAZipper, vRepertoireTemporaire);
            List<FichierArchive> vListFicherArchive = new ArrayList<FichierArchive>();
            vListFicherArchive.add(vFichierArchive);
     
            File vFichierTemporaire = new File(vRepertoireTemporaire + "\\archiveExportDonneesTemporaire.zip");
     
            FileUtils.genererArchive(vListFicherArchive, vFichierTemporaire);
     
            File vFichierTemporaireARetourner = new File (vRepertoireTemporaire + "\\archiveExportDonneesTemporaire.zip");
            //Récupération du zip crée et transformation en tableau de byte[]
     
            // On crée un tableau de byte avec une longueur égal à la taille du fichier
            vTableauArchiveRetour = new byte[(int) vFichierTemporaireARetourner.length()];
            // on crée un BufferedInputStream, qui va nous permettre de lire plusieurs byte d'un coup 
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(vFichierTemporaireARetourner));
            // On lit la totalité du ficher.
            //Le premier paramètre est le tableau de byte qui va recevoir les données,
            //le deuxième est la position dans le fichier où on commence à lire les données (donc zéro puisqu'on commence au début du fichier),
            //enfin le dernier paramètre est le nombre d'octet que l'on veut lire
            in.read(vTableauArchiveRetour, 0, (int) vFichierTemporaireARetourner.length());
     
            return vTableauArchiveRetour;
        }
    Merci

  2. #2
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    Si j'ai bien compris c'est la méthode FileUtils.genererArchive(...) qui génère ton fichier compressé. Donc c'est le code de cette méthode qu'ils nous faut pour pouvoir t'aider.

    A+
    Hydraland

  3. #3
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Citation Envoyé par hydraland
    Salut,

    Si j'ai bien compris c'est la méthode FileUtils.genererArchive(...) qui génère ton fichier compressé. Donc c'est le code de cette méthode qu'ils nous faut pour pouvoir t'aider.

    A+
    Hydraland
    Bonjour,

    Effectivement,

    Voici le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     public static byte[] genererArchive(String aCheminFichierAZipper) throws SauvegardeBaseException, IOException
        {
            byte[] vTableauArchiveRetour = null;
     
            //Generation du fichier zip dans un répertoire temporaire
            String vRepertoireTemporaire = System.getProperty("java.io.tmpdir");
     
            FichierArchive vFichierArchive = new FichierArchive(aCheminFichierAZipper, vRepertoireTemporaire);
            List<FichierArchive> vListFicherArchive = new ArrayList<FichierArchive>();
            vListFicherArchive.add(vFichierArchive);
     
            File vFichierTemporaire = new File(vRepertoireTemporaire + "\\archiveExportDonneesTemporaire.zip");
     
            FileUtils.genererArchive(vListFicherArchive, vFichierTemporaire);
     
            File vFichierTemporaireARetourner = new File (vRepertoireTemporaire + "\\archiveExportDonneesTemporaire.zip");
            //Récupération du zip crée et transformation en tableau de byte[]
     
            // On crée un tableau de byte avec une longueur égal à la taille du fichier
            vTableauArchiveRetour = new byte[(int) vFichierTemporaireARetourner.length()];
            // on crée un BufferedInputStream, qui va nous permettre de lire plusieurs byte d'un coup 
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(vFichierTemporaireARetourner));
            // On lit la totalité du ficher.
            //Le premier paramètre est le tableau de byte qui va recevoir les données,
            //le deuxième est la position dans le fichier où on commence à lire les données (donc zéro puisqu'on commence au début du fichier),
            //enfin le dernier paramètre est le nombre d'octet que l'on veut lire
            in.read(vTableauArchiveRetour, 0, (int) vFichierTemporaireARetourner.length());
     
            return vTableauArchiveRetour;
        }
    Merci

  4. #4
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    Tu as redonné le même code que ton premier post. Ce qu'ils nous faut c'est le code de la méthode FileUtils.genererArchive(vListFicherArchive, vFichierTemporaire);.

    A+
    Hydraland

  5. #5
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Citation Envoyé par hydraland
    Salut,

    Tu as redonné le même code que ton premier post. Ce qu'ils nous faut c'est le code de la méthode FileUtils.genererArchive(vListFicherArchive, vFichierTemporaire);.

    A+
    Hydraland
    Ok, désolée, un peu de fatigue ce matin

    Le voilà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     /**
         * Génère une archive dans le fichier indiqué et contenant les fichier dont on a les chemins
         * @param aListeFichiers
         * @param aFichierSauvegarde
         * @throws SauvegardeBaseException 
         */
        public static void genererArchive(List<FichierArchive> aListeFichiers, File aFichierSauvegarde) throws SauvegardeBaseException
        {
            FileOutputStream vArchiveConfigStream = null;
            ZipOutputStream vZipConfigStream = null;
            //préparation de la lecture des fichiers de config à archiver
            byte data[] = new byte[BUFFER];
            try
            {
                // ouverture des flux de sortie
                vArchiveConfigStream = new FileOutputStream(aFichierSauvegarde);
                vZipConfigStream = new ZipOutputStream(new BufferedOutputStream(vArchiveConfigStream));
                vZipConfigStream.setMethod(ZipOutputStream.DEFLATED); // cette élégante commande signifie que les données seront archivées en mode compressé           
     
                FileInputStream vFichierConfigCourantStream = null;
                BufferedInputStream vFichierConfigCourantBufferedStream = null;
                // on boucle sur les fichiers à archiver
                for (FichierArchive vFichierAArchiver : aListeFichiers)
                {
                    // ouverture  des flux sur le fichier courant en lecture 
                    try 
                    {
                        vFichierConfigCourantStream = new FileInputStream(vFichierAArchiver.getFichier());
                        vFichierConfigCourantBufferedStream = new BufferedInputStream(vFichierConfigCourantStream, BUFFER);
     
                        // ajout au flux zip
                        ZipEntry vFichierCourantZipEntry = new ZipEntry(vFichierAArchiver.getNomDansArchive());
                        vFichierCourantZipEntry.setExtra(vFichierAArchiver.getCode());
                        vZipConfigStream.putNextEntry(vFichierCourantZipEntry);
                        int compteurLecture;
                        // transfert des données du fichier
                        while ((compteurLecture = vFichierConfigCourantBufferedStream.read(data, 0, BUFFER)) != -1)
                        {
                            vZipConfigStream.write(data, 0, compteurLecture);
                        }
                        // fermeture des flux du fichier courant
                        vFichierConfigCourantBufferedStream.close();
                        vFichierConfigCourantStream.close();
                    }
                    catch (Exception e)
                    {
                        LOGGER.warn("Impossible de lire le fichier " + vFichierAArchiver.getFichier().getAbsolutePath());
                    }
                }
            }
            catch (Exception e)
            {
                LOGGER.error("Erreur lors de la génération d'un archive contenant les données client : " + e);
                e.printStackTrace();
                throw new SauvegardeBaseException(e.toString());
            }
            finally
            {
                // fermeture des flux de sortie
                try
                {
                    if (vZipConfigStream != null)
                    {
                        vZipConfigStream.close();
                    }
                    if (vArchiveConfigStream != null)
                    {
                        vArchiveConfigStream.close();
                    }
                }
                catch (IOException e)
                {
                    LOGGER.error("Erreur de fermeture des flux de sortie", e);
                }
            }
        }

  6. #6
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Re,

    j'y réfléchis et quand je débug,

    j'ai le répertoire temporaire sans l'arbo donc, quelque part, s'est normal qu'elle n'y soit pas dans le zip car de lui même il va pas savoir qu'il faut remonter 2 dossiers au dessus pour garder l'arbo ...

  7. #7
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Je pense que le problème vient de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZipEntry vFichierCourantZipEntry = new ZipEntry(vFichierAArchiver.getNomDansArchive());
    Que te renvoi vFichierAArchiver.getNomDansArchive()?

    Hydraland

  8. #8
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Citation Envoyé par hydraland
    Je pense que le problème vient de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZipEntry vFichierCourantZipEntry = new ZipEntry(vFichierAArchiver.getNomDansArchive());
    Que te renvoi vFichierAArchiver.getNomDansArchive()?

    Hydraland
    re,

    ca me renvoit 'C:\DOCUME~1\montigny\Local Settings\Temp\\tp_17.ktr' s'est à dire, le chemin des éléments à archiver mais pas avec l'arborescence correcte ...

    il faudrait qu'il zippe tout le dossier passé en chemin en fait

  9. #9
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Il faut donc que vFichierAArchiver.getNomDansArchive() te renvoi la bonne arborescence. J'ai fait le test suivant, je pense qu'il devrait t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public class test {
     
    	public static void main(String[] args) {
    		FileOutputStream vArchiveConfigStream = null;
    		ZipOutputStream vZipConfigStream = null;
    		//préparation de la lecture des fichiers de config à archiver
    		try {
    			// ouverture des flux de sortie
    			vArchiveConfigStream = new FileOutputStream("E:/temp/test.zip");
    			vZipConfigStream = new ZipOutputStream(new BufferedOutputStream(
    					vArchiveConfigStream));
    			vZipConfigStream.setMethod(ZipOutputStream.DEFLATED); // cette élégante commande signifie que les données seront archivées en mode compressé           
     
    			// on boucle sur les fichiers à archiver
    			// ouverture  des flux sur le fichier courant en lecture 
    			try {
    				// ajout au flux zip
    				ZipEntry vFichierCourantZipEntry = new ZipEntry(
    						"c:/temp/toto.txt");
    				vZipConfigStream.putNextEntry(vFichierCourantZipEntry);
    				// transfert des données du fichier
    				vZipConfigStream.write(new byte[] { 10, 15, 12, 15, 4, 9, 15 });
    				// fermeture des flux du fichier courant
     
    				vFichierCourantZipEntry = new ZipEntry("c:/test/tata.txt");
    				vZipConfigStream.putNextEntry(vFichierCourantZipEntry);
    				// transfert des données du fichier
    				vZipConfigStream.write(new byte[] { 10, 15, 12, 15, 4, 9, 15 });
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			// fermeture des flux de sortie
    			try {
    				if (vZipConfigStream != null) {
    					vZipConfigStream.close();
    				}
    				if (vArchiveConfigStream != null) {
    					vArchiveConfigStream.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    A+
    Hydraland

  10. #10
    Membre Expert Avatar de nebule
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 507
    Par défaut
    Ok, j'ai trouvé, je passais pas le chemin relatif en entier, juste le nom du fichier.

    Merci, ca devrait avancer un peu comme ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Zip] Transformer plusieurs fichiers en fichier zip
    Par Anakior dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 14/12/2005, 15h27
  2. [ZIP] zipper des fichiers de plus d'un mega
    Par sylviefrfr dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/10/2005, 14h40
  3. problem de compression(zip) d'un fichier sur windows.
    Par timsah dans le forum Autres Logiciels
    Réponses: 14
    Dernier message: 25/10/2005, 13h21
  4. [Zip] Créer un fichier zip
    Par Mykeul dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 07/03/2005, 16h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo