Dézippé un fichier

xnooztv Messages postés 6 Date d'inscription mercredi 6 janvier 2016 Statut Membre Dernière intervention 23 décembre 2018 - Modifié par xnooztv le 7/01/2016 à 04:59
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 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.

5 réponses

Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
7 janv. 2016 à 18:18
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?
0
xnooztv Messages postés 6 Date d'inscription mercredi 6 janvier 2016 Statut Membre Dernière intervention 23 décembre 2018
Modifié par xnooztv le 7/01/2016 à 20:48
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)
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
7 janv. 2016 à 21:22
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.
0
xnooztv Messages postés 6 Date d'inscription mercredi 6 janvier 2016 Statut Membre Dernière intervention 23 décembre 2018
7 janv. 2016 à 21:26
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
8 janv. 2016 à 09:18
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.
0
Rejoignez-nous