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

Silverlight Discussion :

Sauvegarde au format Zip


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut Sauvegarde au format Zip
    Bonjour,

    J'aimerai avoir des conseils pour sauvegarder des fichiers sur la machine cliente. Je m'explique :

    Mon application Silverlight crée 3 fichiers XDocument que j'enregistre un par un au format xml grâce à trois SaveFileDialog différentes :

    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
     
    XDocument myXml = new XDocument(...);
     
    SaveFileDialog mySaveFileDialog = new SaveFileDialog();
                mySaveFileDialog.DefaultExt = ".xml"; // Extension par défaut
                mySaveFileDialog.Filter = "XML | *.xml"; // Extension proposée
     
                bool? ret = mySaveFileDialog.ShowDialog();
                if (ret == true)
                {
                    using (Stream fs = (Stream)mySaveFileDialog.OpenFile())
                    {
                        myXml.Save(fs); // Enregistre le fichier au format xml
                        fs.Close();
                    }
                }
    Je répète donc ce code trois fois, qui est appelé par trois boutons différents. J'aimerais pouvoir créer un fichier zip contenant ces trois fichiers au format xml et un dossier vide, ce qui me permettrait de les sauvegarder à l'aide d'une unique SaveFileDialog.

    Comment créer ce fichier zip ?

    Pour Silverlight, je n'ai trouvé que la librairie SharpZipLib pour créer des fichiers zip. Seulement avec tout les exemples que j'ai vu, aucun ne correspond à ce qu'il me faut. (Si vous avez un lien utile, n'hésitez pas à me le passer)

    J'espère avoir été assez claire pour me faire comprendre. Merci à tout ceux qui pourront m'aider.

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Il te faut utiliser la version Silverlight de SharpZipLib
    http://slsharpziplib.codeplex.com/

    Ensuite tu crees en memoire un zip contenant tes 3 fichiers xml et tu le proposes en telechargement via ton SaveFileDialog.

    Le premier exemple ici explique comment creer un fichier zip et ajouter des fichiers dedans
    http://wiki.sharpdevelop.net/SharpZi...p-Samples.ashx

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut
    Merci Skyounet pour ta réponse. Mais j'avais déjà vu ce site et je ne pense pas que cette solution me convienne. En effet ils utilisent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string entryName = ZipEntry.CleanName(filename); // Removes drive from name and fixes slash direction
    ZipEntry newEntry = new ZipEntry(entryName);
    Mon problème est que je veux enregistrer des XDocument que je créé dans mon application, ils n'ont donc pas d'adresse (de filename de type string dans l'exemple).

    Même si la solution est évidente, je veux bien que tu me la détail car je débute tout juste en Silverlight.

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    MS fournit deux flux compressés, utilisants les algos GZip et Delfate (System.IO.Compression). Deflate est l'algo du format zip. Tu peux donc enregistrer tes trois fichiers les uns à la suite des autres dans un flux deflate et le sauvegarder. En revanche, le fichier généré ne sera pas au format zip proprement dit puisqu'il n'aura pas, justement, de système de fichiers embarqué et ne pourra sans doute pas être lu par les logiciels habituels. Mieux vaut donc ne pas lui donner l'extension .zip.

    Si tu souhaites créer de vrais fichiers zip, alors reste sur ta méthode et assigne des noms arbitraires à ces trois fichiers.

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    entryName c'est juste le nom du fichier dans le fichier zip, tu peux mettre ce que tu veux.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut
    Merci de vos réponse.

    J'essaye depuis hier et je suis très prêt du but (pour l'instant je ne m'occupe que de zipper un seul fichier). Mon dernier problème (j'espère en tout cas) est pour sauvegarder mon fichier zip dans le flux de la SaveFileDialog :

    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
     
    MemoryStream outputMemStream = new MemoryStream();
    ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);
     
    zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
     
    ZipEntry newEntry = new ZipEntry("model.xml");
    newEntry.DateTime = DateTime.Now; // Note the zip format stores 2 second granularity
     
    zipStream.PutNextEntry(newEntry);
     
    byte[] buffer = new byte[4096];
     
    MemoryStream fsModel = new MemoryStream();
    myXml.Save(fsModel);
    StreamUtils.Copy(fsModel, zipStream, buffer);
     
    zipStream.CloseEntry();
     
                SaveFileDialog mySaveFileDialog = new SaveFileDialog();
                mySaveFileDialog.DefaultExt = ".zip"; // Extension par défaut
                mySaveFileDialog.Filter = "ZIP | *.zip"; // Extension proposée
     
                bool? ret = mySaveFileDialog.ShowDialog();
                if (ret == true)
                {
                    using (Stream fs = (Stream)mySaveFileDialog.OpenFile())
                    {
                        zipStream.CopyTo(fs);
                        fs.Close();
                    }
                }
     
                zipStream.IsStreamOwner = false;
                zipStream.Close();
    Lorsque j'exécute mon code, et que j'appel cette méthode, soit j'ai une erreur sur "zipStream.CopyTo(fs);", qui me dit que le stream ne peux pas être utilisé en lecture, soit je peux exporter mon fichier mais quand je l'ouvre avec 7-Zip, j'ai le droit au message : "... ne peut être ouvert comme une archive". Pas très stable comme erreur

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut
    Problème résolu !

    Je ne sais pas si c'est très propre comme façon de faire, mais ça a le mérite de fonctionner. J'écrit toute mes méthodes de zip dans le saveFileDialog, ce qui me permet d'écrire directement dans son flux :

    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
     
                SaveFileDialog mySaveFileDialog = new SaveFileDialog();
                mySaveFileDialog.DefaultExt = ".zip"; // Extension par défaut
                mySaveFileDialog.Filter = "ZIP | *.zip"; // Extension proposée
     
                bool? ret = mySaveFileDialog.ShowDialog();
                if (ret == true)
                {
                    using (Stream fs = (Stream)mySaveFileDialog.OpenFile())
                    {
     
                        ZipOutputStream zipStream = new ZipOutputStream(fs); // <- Problème résolu
     
                        zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
     
                        ZipEntry newEntry = new ZipEntry("model.xml");
                        newEntry.DateTime = DateTime.Now;
     
                        zipStream.PutNextEntry(newEntry);
     
                        // Zip the file in buffered chunks
                        // the "using" will close the stream even if an exception occurs
                        byte[] buffer = new byte[4096];
     
                        MemoryStream fsModel = new MemoryStream();
                        myXml.Save(fsModel);
                        StreamUtils.Copy(fsModel, zipStream, buffer);
     
                        zipStream.CloseEntry();
                        zipStream.IsStreamOwner = false;
                        zipStream.Close();
     
                        fs.Close();
                    }
                }

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

Discussions similaires

  1. Comment sauvegarder au format texte cette BD ?
    Par Invité dans le forum Ada
    Réponses: 4
    Dernier message: 28/02/2007, 17h55
  2. [rave report 5][delphi] Sauvegarde au format pdf
    Par daheda dans le forum Delphi
    Réponses: 4
    Dernier message: 08/11/2006, 13h37
  3. fichier de sauvegarde au format XML
    Par freecell31 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 22/05/2006, 00h26
  4. [TRichEdit] Comment sauvegarder au format wmf ?
    Par PpPool dans le forum Composants VCL
    Réponses: 4
    Dernier message: 14/03/2005, 14h37
  5. Compression de données au format Zip avant sauvegarde
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/09/2004, 16h40

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