[C#] Création de mon premier projet.

Signaler
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012
-
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012
-
Bonjour,

J'aimerai créer un outils (graphique) assez simple. Cet outil doit savoir explorer et modifier une sorte de .zip (C'est un .xap, un format pour Windows Phone 7 qui est très très proche du .zip)

Il n'y a que deux types de ressource à identifier et à modifier/changer. .png et .xml.

J'ai commencé à le codé en C#

J'ai terminé (quasiment la partie) graphique du soft. Tous les boutons n'appellent pas encore toutes les fonctions car je bloque dès le début. (Je n'arrive pas à entrer dans les ressources du .xap (.zip) en fait)

En effet, le principe c'est de modifier deux ressources dans le .xap (png et xml) mais aussi d'ajouter un provxml.

Je crois après des recherches avoir compris que pour explorer un .zip je dois avoir ICSharpCode.SharpZipLib.dll.

Je sais pas du tout comment faire. C'est mon premier réel projet. J'espère que vous allez pouvoir m'aider dans cette première expérience! Jusqu'à aujourd'hui je n'avais fais que des programmes en console de type cours comme des jeux du chaud ou froid. Je suis donc réellement novice. Mais j'ai ce projet à coeur. J'espère que vous allez pouvoir m'aider!

Merci pour tout !

46 réponses

Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

Mon projet ressemble à ça pour le moment.

http://www.hostingpics.net/viewer.php?id=783079xapeditor.png
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Hello,
Tu peux renommer ton xap en zip et ainsi, tu peux utiliser la lib SharpZipLib
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

J'ai justement essayé mais en fait c'est que je n'arrive pas à intégrer SharpzipLib dans mon cod source, je n'ai vu ça nul part dans les bouquins que j'ai achetés...

Voilà le code source pour choisir le .xap:

private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                System.IO.StreamReader sr = new
                System.IO.StreamReader(openFileDialog1.FileName);
                MessageBox.Show(sr.ReadToEnd());
                sr.Close();
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Il faut que tu l'ajoutes en tant que référence dans ton projet

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

C'est à dire que je dois, dans mon code source appelé la dll ? (de quelle manière dans ce cas?)(en supposant qu'elle sera dans le même fichier que le .exe.)

Sur un site de MS, j'ai trouvé des trucs pour lire des .zip.

using System;
using Ionic.Zip;

namespace Ionic.Zip.Examples
{
    public class ReadZip
    {
        private static void Usage()
        {
            Console.WriteLine("usage:\n  ReadZip2 <zipfile> ");
            Environment.Exit(1);
        }


        public static void Main(String[] args)
        {

            if (args.Length != 2) Usage();
            if (!System.IO.File.Exists(args[0]))
            {
                Console.WriteLine("That zip file does not exist!\n");
                Usage();
            }

            try
            {
                // Specifying Console.Out here causes diagnostic msgs to be sent to the Console
                // In a WinForms or WPF or Web app, you could specify nothing, or an alternate
                // TextWriter to capture diagnostic messages. 

                using (ZipFile zip = ZipFile.Read(args[0], System.Console.Out))
                {
                    // This call to ExtractAll() assumes:
                    //   - none of the entries are password-protected.
                    //   - want to extract all entries to current working directory
                    //   - none of the files in the zip already exist in the directory;
                    //     if they do, the method will throw.
                    zip.ExtractAll(args[1]);
                }
            }
            catch (System.Exception ex1)
            {
                System.Console.Error.WriteLine("exception: " + ex1);
            }

        }
    }
}


j'ai essayé de l'intégrer dans mon code, je n'ai eu que des erreurs
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Au niveau de ton projet, tu peux faire un clic droit > Ajouter une référence.
Quelles sont les erreurs que tu obtiens avec le code que tu postes?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

 private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() = = System.Windows.Forms.DialogResult.OK)
            {
                System.IO.StreamReader sr = new
                System.IO.StreamReader(openFileDialog1.FileName);
                MessageBox.Show(sr.ReadToEnd());
                sr.Close();
               public class ReadZip
    {
        private static void Usage()
        {
            Console.WriteLine("usage:\n  ReadZip2 <zipfile> ");
            Environment.Exit(1);
        }


        public static void Main(String[] args)
        {

            if (args.Length != 2) Usage();
            if (!System.IO.File.Exists(args[0]))
            {
                Console.WriteLine("That zip file does not exist!\n");
                Usage();
            }

            try
            {
                // Specifying Console.Out here causes diagnostic msgs to be sent to the Console
                // In a WinForms or WPF or Web app, you could specify nothing, or an alternate
                // TextWriter to capture diagnostic messages. 

                using (ZipFile zip = ZipFile.Read(args[0], System.Console.Out))
                {
                    // This call to ExtractAll() assumes:
                    //   - none of the entries are password-protected.
                    //   - want to extract all entries to current working directory
                    //   - none of the files in the zip already exist in the directory;
                    //     if they do, the method will throw.
                    zip.ExtractAll(args[1]);
                }
            }
            catch (System.Exception ex1)
            {
                System.Console.Error.WriteLine("exception: " + ex1);
            }

        }
    }
}
            }

        }


J'obtiens "Definition de type ou d'espace de noms, ou de fichier attendue"

J'ai ajouté dans les référence " ICSharpCode.SharpZipLib.dll "

 private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog()  == System.Windows.Forms.DialogResult.OK)
            {
                System.IO.StreamReader sr = new
                System.IO.StreamReader(openFileDialog1.FileName);
                MessageBox.Show(sr.ReadToEnd());
                sr.Close();


lorsque je suis là, je dois faire appel à cette référence? Si oui, comment ??

Merci pour ton aide !
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Tu peux regarder ici ou bien

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

Très bien, merci, je vais essayer de regarder ça ce soir en rentrant, merci pour tout buno
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

Bonjour, j'ai donc essayé de m'en sortir avec le lien pour unzip. (Je veux travailler sur les .xap mais pour l'instant je test que sur des .zip)

J'obtiens des erreurs. je crois que je copie mal le code.

 private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                System.IO.StreamReader sr = new
                System.IO.StreamReader(openFileDialog1.FileName);
                MessageBox.Show(sr.ReadToEnd());
                sr.Close();FileStream fileStreamIn = new FileStream
(SrcFile, FileMode.Open, FileAccess.Read);
    ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);
    ZipEntry entry = zipInStream.GetNextEntry();
    FileStream fileStreamOut = new FileStream
(DstFile + @"" + entry.Name, FileMode.Create, FileAccess.Write);
    int size;
    byte[] buffer = new byte;
    do
    {
        size = zipInStream.Read(buffer, 0, buffer.Length);
        fileStreamOut.Write(buffer, 0, size);
    } while (size > 0);
    zipInStream.Close();
    fileStreamOut.Close();
    fileStreamIn.Close();


J'ai bien ajouté la référence de la Sharp zip lib et ajouté en haut du code l'utilisation de cette référence.

using ICSharpCode.SharpZipLib.Zip;
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

En revanche le principe de unzip -> Modifier puis Reziper me plait bien. Au début je pensais effectuer les modifications directement dans le .zip.

Merci de l'aide que vous pourez m'apporter pour pouvoir unzip un .zip depuis mon programme en choisissant le fichier depuis le bouton "Choose the .XAP (même si pour l'instant j'essaie déjà sur des .zip)
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Quel genre d'erreur?
Je n'ai malheureusement rien sous la main pour tester...je marche donc à l'aveuglette.
Tu fais bien de travailler sur des zip directement. Il te faudra juste renommer ton xap en zip et ce sera fini

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

Je crois que c'est un problème de compatibilité entre VS 08 et VS 10.. Le code proviens de VS 08, moi j'ai 10.

Mais j'ai trouvé un truc intéressant,
private void buttonOpenFile_Click(object sender, EventArgs e)
        {
            //show a openfiledialog to select a file
            OpenFileDialog f = new OpenFileDialog();
            f.Multiselect = false;
            if (f.ShowDialog() == DialogResult.OK)
            {
                textBoxFileName.Text = f.FileName;
            }
        }

        private void buttonOK_Click(object sender, EventArgs e)
        {
            if (textBoxFileName.Text != "")
            {
                if (radioButtonZip.Checked == true)
                {
                    //start a new thread to zip it
                    Thread th = new Thread(new ThreadStart(Zip));
                    th.Start();
                }
                else
                {
                    //start a new thread to unzip it
                    Thread th = new Thread(new ThreadStart(UnZip));
                    th.Start();
                }
            }
        }


C'est une partie du code source d'un logiciel de Zip/Unzip.

Je vais essayer de l'adapter dans le mien. Pour le moment juste unzip.

Je pense bientôt réussir à extraire le contenue du .zip, je galère un peu. Je post le code dès que ça marche :)
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

private void button6_Click(object sender, EventArgs e)
        {
            if (textBoxFileName.Text != "")
            {
                Thread th = new Thread(new ThreadStart(Unzip));
                th.Start();
            }
        }


J'ai cette erreur, je ne sais pas trop à quoi ça correspond. Certainement parce que je fais du plagiat de code..

"le nombre (Unzip) n'existe pas dans le contexte actuel"
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Unzip est sûrement la méthode appelé pour faire le travail de décompression...
Regarde dans le code que tu as récupéré: il faut que tu récupères également cette méthode (et Zip par la même occasion).

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
using System.Threading;

namespace ZipTest
{
    public partial class FormZip : Form
    {
        public FormZip()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            radioButtonZip.Checked = true;
        }

        private void buttonOpenFile_Click(object sender, EventArgs e)
        {
            //show a openfiledialog to select a file
            OpenFileDialog f = new OpenFileDialog();
            f.Multiselect = false;
            if (f.ShowDialog() == DialogResult.OK)
            {
                textBoxFileName.Text = f.FileName;
            }
        }

        private void buttonOK_Click(object sender, EventArgs e)
        {
            if (textBoxFileName.Text != "")
            {
                if (radioButtonZip.Checked == true)
                {
                    //start a new thread to zip it
                    Thread th = new Thread(new ThreadStart(Zip));
                    th.Start();
                }
                else
                {
                    //start a new thread to unzip it
                    Thread th = new Thread(new ThreadStart(UnZip));
                    th.Start();
                }
            }
        }

        private void Zip()
        {
            toolStripStatusLabel1.Text = "Zipping...";
            SetButtonOK(false);
            ZipHelp.Zip(textBoxFileName.Text, textBoxFileName.Text + ".zip", 4096);
            toolStripStatusLabel1.Text = "Done";
            SetButtonOK(true);
        }

        private void UnZip()
        {
            toolStripStatusLabel1.Text = "UnZipping...";
            SetButtonOK(false);
            ZipHelp.UnZip(textBoxFileName.Text, Path.GetDirectoryName(textBoxFileName.Text), 4096);
            toolStripStatusLabel1.Text = "Done";
            SetButtonOK(true);
        }

        //the method to set button's state
        private void SetButtonOK(bool Enable)
        {
            if (buttonOK.InvokeRequired)
                buttonOK.Invoke(new SetEnableCallBack(SetButtonOK), new object[] { Enable });
            else
                buttonOK.Enabled = Enable;
        }

        //delegate to call back
        delegate void SetEnableCallBack(bool Enable);
    }
}


C'est le code que j'ai récup.

Eux utilise un "radio button" pour choisir entre zip et Unzip" moi je vais faire deux boutons distincts!
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Pas de soucis

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

Rien ne marche... Le bouton 6 est censé enclencher le unzip mais j'arrive pas à faire tourner les codes que je trouve sur le net. J'ai changé de référence, j'ai pris DotNetLib Ionic.zip.dll

Il donne des exemples de code pour extraire ou zippé mais rien ne marche.. c'est chiant d'être nul !
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Tu ne vas pas y arriver en changeant 36 fois de références car forcément, ton code sera plus bon.
Dans ton cas, pas besoin de thread.
Tu dispose de 2 boutons: Zip et Unzip.
Dans la callback de chaque bouton, avec SharpLibZip, tu as "juste" à mettre le code adéquat. Par exemple, pour Unzip:
ZipInputStream s = new ZipInputStream(zipFilePath);  // ici, je suppose que zipFilePath contient le chemin vers le fichier zip
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
  string directoryName = Path.GetDirectoryName(theEntry.Name);
  string fileName = Path.GetFileName(theEntry.Name);
  string folder = "C:\\monDossier\";   // ici, c'est le répertoire qui va recevoir le contenu de ton zip

  // create directory
  Directory.CreateDirectory(folder +directoryName);
  if (fileName != String.Empty)
  {
    FileStream streamWriter = File.Create((folder + theEntry.Name));
    int size = 2048;
    byte[] data = new byte[2048];
    while (true)
    {
      size = s.Read(data, 0, data.Length);
      if (size > 0)
      {
        streamWriter.Write(data, 0, size);
      }
      else
      {
        break;
      }
    }
    
    streamWriter.Close();
  }
}
s.Close();


Essaie déjà ça avec un fichier zip "simple", c'est-à-dire qui n'a pas de dossier dedans.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
58
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 juillet 2012

C'est un .zip sur mon bureau avec juste une image dedans.