Dézippé un fichier

xnooztv 3 Messages postés mercredi 6 janvier 2016Date d'inscription 7 janvier 2016 Dernière intervention - 7 janv. 2016 à 00:05 - Dernière réponse : Whismeril 12026 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 septembre 2018 Dernière intervention
- 8 janv. 2016 à 09:18
Bonjour,

Voila, je suis sur la création d'un launcher et je souhaite dézippé le fichier dans le dossier ou se trouve le launcher.
Mon launcher récupère un fichier de configuration sur mon site, voici le fichier conf.txt:

http://lsl-rp.ga/landwars/update/version.txt http://lsl-rp.ga/landwars/update/maj.zip DOSSIER_LORS_DU_DEZIP


Donc, quand mon launcher dézip le fichiermaj.zip, il crée un dossier "DOSSIER_LORS_DU_DEZIP" et les fichiers sont dedans.

Mais, je souhaiterais dézippé maj.zip dans le dossier ou se trouve mon launcher.

Voici mon code:
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Launcher
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    enum UpdateState { search, available, download, update };

    public partial class MainWindow : Window
    {
        private string m_confUrl = "http://lsl-rp.ga/landwars/update/conf.txt";

        //Variable de configuration
        string m_versionUrl = null, m_zipUrl = null, m_unziPath = null;
        private UpdateState m_updateState;

        public MainWindow()
        {
            InitializeComponent();
            m_updateState = UpdateState.search;

            //Si l'évenement this.Close() est appeler.
            this.Closing += delegate
            {
                if (m_updateState == UpdateState.download) //Si le téléchargement est en cours.
                {
                    if (MessageBox.Show("Le téléchargement sera annuler si vous quittez.", "Voulez vous quitter ?", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                    {
                        this.Close();
                    }
                }
            };

            //Téléchargement du fichier de configuration
            WebClient request = new WebClient();
            request.DownloadFile(m_confUrl, "Landwars_Data/conf.txt");

            //Lecture du fichier
            StreamReader initReader;
            initReader = new StreamReader("Landwars_Data/conf.txt");

            string lineRead = initReader.ReadLine();
            if (lineRead != null)
            {
                string[] settingLine = lineRead.Split(' ');

                m_versionUrl = settingLine[0];
                m_zipUrl = settingLine[1];
                m_unziPath = settingLine[2];
            }
            else
                MessageBox.Show("Erreur: Fichier de configuration illisible", "ERREUR", MessageBoxButton.OK, MessageBoxImage.Stop);

            initReader.Close();

            //Vérification de la version, mise à jour ou non.
            if (File.Exists("Landwars_Data/version.txt")) // Voir si le fichier version.txt existe sur l'ordinateur.
            {
                Stream data = request.OpenRead(m_versionUrl); // Lire la version en ligne du version
                StreamReader reader = new StreamReader(data);
                string onlineVersion = reader.ReadLine();
                reader.Close();

                StreamReader localVersionStream;//Local
                localVersionStream = new StreamReader("Landwars_Data/version.txt");
                string localVersion = localVersionStream.ReadLine();
                localVersionStream.Close();

                if (onlineVersion == localVersion) //Si il existe, vérifier que le client est à jour
                {
                    //Tout est à jour
                    m_updateState = UpdateState.update;
                }
                else
                {
                    //Mise à jour
                    m_updateState = UpdateState.available;
                    Download();
                }
            }
            else //Si il n'existe pas, alors mise à jour.
            {
                //Mise à jour
                m_updateState = UpdateState.available;
                Download();
            }
        }

        //Update
        private bool Download()
        {
            if (m_updateState == UpdateState.available)
            {
                m_updateState = UpdateState.download;
                Play.Content = "Mise à jour en cours ..."; //On change le texte
                Play.Margin = new Thickness(304, 104, 0, 0);

                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri(m_zipUrl), "maj.zip");
            }

            return true;
        }

        private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            Play.Margin = new Thickness(602, 104, 0, 0);
            Play.Content = "Jouer";

            if (Directory.Exists(m_unziPath)) //On supprime l'ancienne version.
            {
                string[] filePaths = Directory.GetFiles(m_unziPath);
                foreach (string filePath in filePaths)
                    File.Delete(filePath);
            }

            Decompress("maj.zip", m_unziPath, true);

            //Mettre à jour le version.txt local
            WebClient webClient = new WebClient();
            webClient.DownloadFile(new Uri(m_versionUrl), "Landwars_Data/version.txt");

            m_updateState = UpdateState.update;
        }

        private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            Play.Content = "Mise à jour en cours (" + e.ProgressPercentage + "%)";
        }

        //Button Event
        private void OfficialWebSite_Click(object sender, RoutedEventArgs e)
        {
            Process.Start("https://minecraft.net/");
        }

        private void Exit_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Play_Click(object sender, RoutedEventArgs e)
        {
            if(m_updateState == UpdateState.update)
            {
                //Lancement de votre exécutable
                System.Diagnostics.ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo();
                start.FileName = ".exe";
                start.WorkingDirectory = m_unziPath;
                System.Diagnostics.Process.Start(start);
            }
        }

        //Unzip
        public bool Decompress(string source, string destinationDirectory, bool deleteOriginal = false)
        {
            //Ouverture d'un nouveau contexte ZipInputStream (Librairie)
            using (var zipStream = new ZipInputStream(File.OpenRead(source)))
            {
                ZipEntry entry = null;
                string tempEntry = string.Empty;

                while ((entry = zipStream.GetNextEntry()) != null)
                {
                    string fileName = System.IO.Path.GetFileName(entry.Name);

                    if (destinationDirectory != string.Empty)
                        Directory.CreateDirectory(destinationDirectory);

                    if (!string.IsNullOrEmpty(fileName))
                    {
                        if (entry.Name.IndexOf(".ini") < 0)
                        {
                            string path = destinationDirectory + @"\" + entry.Name;
                            path = path.Replace("\\ ", "\\");
                            string dirPath = System.IO.Path.GetDirectoryName(path);
                            if (!Directory.Exists(dirPath))
                                Directory.CreateDirectory(dirPath);
                            using (var stream = File.Create(path))
                            {
                                int size = 2048;
                                byte[] data = new byte[2048];

                                byte[] buffer = new byte[size];

                                while (true)
                                {
                                    size = zipStream.Read(buffer, 0, buffer.Length);
                                    if (size > 0)
                                        stream.Write(buffer, 0, size);
                                    else
                                        break;
                                }
                            }
                        }
                    }
                }
            }

            if (deleteOriginal)
                File.Delete(source);

            return true;
        }
    }
}



Pour informations, j'ai déjà essayer de retirer "DOSSIER_LORS_DU_DEZIP" ou de le remplacer par un "/" ou un "\", mon launcher crash.


Si quelqu'un aurais une idée..

Cordialement.
Afficher la suite 

Votre réponse

5 réponses

Whismeril 12026 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 septembre 2018 Dernière intervention - 7 janv. 2016 à 18:18
0
Merci
Bonsoir, mettre tout ton code n'est pas très utile, cela oblige celui qui voudrait tester à créer une Window "clone" de la tienne... ou à chercher dans tout ça les parties utiles, soit le téléchargement et la décompression....

Ton (tes?) lien maintenant, tu l'as mis entre des balises de codes du coup, pas sûr de le lire correctement

A cette adresse
http://lsl-rp.ga/landwars/update/version.txt

il y a un bien un fichier texte, ici
http://lsl-rp.ga/landwars/update/maj.zip

Un zip avec une image dedans, je ne comprends pas ce que vient faire la chaine DOSSIER_LORS_DU_DEZIP

Donc tout d'abord quel est le lien de téléchargement?
Commenter la réponse de Whismeril
xnooztv 3 Messages postés mercredi 6 janvier 2016Date d'inscription 7 janvier 2016 Dernière intervention - Modifié par xnooztv le 7/01/2016 à 20:48
0
Merci
Salut,

Mon launcher récupère un fichier de configuration (http://lsl-rp.ga/landwars/update/conf.txt)

Dans le fichier de configuration, le premier lien est la version du jeu
Le deuxième, le lien du patch à faire télécharger sur le launcher
Le troisième, c'est le nom du dossier d'extraction de maj.zip

Le lien de téléchargement est bel et bien http://lsl-rp.ga/landwars/update/maj.zip mais j'ai mis une image dedans pour tester mon launcher :)

Donc, DOSSIER_LORS_DU_DEZIP s'active quand mon launcher à fini de télécharger la mise à jour, et le dossier "DOSSIER_LORS_DU_DEZIP " se crée et il y aura les mise à jours dedans.

Mais moi je souhaite, que lorsque mon launcher unzip maj.zip, il le dezip à l'endroit ou est le launcher (a la racine) et qu'il ne crée par de dosseier (ex: DOSSIER_LORS_DU_DEZIP)
Commenter la réponse de xnooztv
Whismeril 12026 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 septembre 2018 Dernière intervention - 7 janv. 2016 à 21:22
0
Merci
Ok mais tu demandes exactement le contraire à ton programme....
ligne 68
m_unziPath = settingLine[2];
là tu enregistre "Dossier_Lors_du_Dezip"

ligne 131 à 136
            if (Directory.Exists(m_unziPath)) //On supprime l'ancienne version.
            {
                string[] filePaths = Directory.GetFiles(m_unziPath);
                foreach (string filePath in filePaths)
                    File.Delete(filePath);
            }
tu testes si le dossier existe déjà et si oui tu le vides.


ligne 138
Decompress("maj.zip", m_unziPath, true);
tu envoies ce chemin à ta méthode de décompression.

Dans celle-ci, tu (re)crées le dossier et tu décompresse dedans, lignes 188 à 219.

Donc, il fait précisément ce que tu dis ne pas vouloir.


Tu peux essayer d'appeler Decompress comme ça:
Decompress("maj.zip", string.Empty, true);


Mais bon, dommage de s'être donné tant de mal à faire en sorte de lire sur un serveur le nom d'un dossier à créer, le réinitialiser s'il existe déjà, avec l'avantage comme ça d'effacer la version obsolète, et enfin télécharger et deziper la nouvelle version dans ce dossier.


Il n'est pas de toi ce code, si?

Au fait dans la framework, il y a déjà des outils de compression/decompression https://msdn.microsoft.com/fr-fr/library/ms404280(v=vs.110).aspx
pas besoin d'aller en chercher ailleurs, qui par ailleurs n'ont pas été mis à jour depuis 2010.
Commenter la réponse de Whismeril
xnooztv 3 Messages postés mercredi 6 janvier 2016Date d'inscription 7 janvier 2016 Dernière intervention - 7 janv. 2016 à 21:26
0
Merci
Le code n'est pas de moi, j'ai suivie un tutoriel mais il n'a pas expliquer la fonction ZIP c'est pour sa que je suis venu vous voir..

J'ai regarder vite fais la documentation et maintenant sa fonctionne.

Pour ceux qui sa intéresse:

        public void ExtractZipFile(string archiveFilenameIn, string password, string outFolder)
{
ZipFile zf = null;
try
{
FileStream fs = File.OpenRead(archiveFilenameIn);
zf = new ZipFile(fs);
if (!String.IsNullOrEmpty(password))
{
zf.Password = password; // AES encrypted entries are handled automatically
}
foreach (ZipEntry zipEntry in zf)
{
if (!zipEntry.IsFile)
{
continue; // Ignore directories
}
String entryFileName = zipEntry.Name;
// to remove the folder from the entry:- entryFileName = Path.GetFileName(entryFileName);
// Optionally match entrynames against a selection list here to skip as desired.
// The unpacked length is available in the zipEntry.Size property.

byte[] buffer = new byte[4096]; // 4K is optimum
Stream zipStream = zf.GetInputStream(zipEntry);

// Manipulate the output filename here as desired.
String fullZipToPath = System.IO.Path.Combine(outFolder, entryFileName);
string directoryName = System.IO.Path.GetDirectoryName(fullZipToPath);
if (directoryName.Length > 0)
Directory.CreateDirectory(directoryName);

// Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size
// of the file, but does not waste memory.
// The "using" will close the stream even if an exception occurs.
using (FileStream streamWriter = File.Create(fullZipToPath))
{
StreamUtils.Copy(zipStream, streamWriter, buffer);
}
}
}


Le code pour extraire un fichier:

ExtractZipFile("fichier.zip", "MotDePasseSinonMettezRien", "DossierDeDestination");



Mais merci pour t'es explications :D
Commenter la réponse de xnooztv
Whismeril 12026 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 septembre 2018 Dernière intervention - 8 janv. 2016 à 09:18
0
Merci
Bonjour,

On aurait pu gagner du temps, si tu avais présenté les choses comme il faut, la charte explique que l'on peut utiliser un code source à condition de ne pas s'en attribuer la paternité, il en va de même sur l'ensemble des sites de partage.

En commençant, par "j'ai trouvé" ou "on m'a donné" plutôt que par

Voila, je suis sur la création d'un launcher


Ma première lecture du code n'aurait pas été la même.

Présenter les choses correctement permet non seulement de respecter les règles du partage, mais aussi d'obtenir plus rapidement une aide efficace.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.