Envoi de fichier

Signaler
Messages postés
18
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
22 avril 2010
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour a tous, j'ai réalisé une application client serveur et il me reste deux trois détails a régler et je n'y arrive pas c'est pour ce la que je fais appelle a vous.

- j'arrive a télécharger des fichiers, mais seulement des fichiers textes (les images, pdf, binaires font quitter le prog avec notification d'erreurs)

Cette fonction envoie le fichier (du cote envoie apparament ca marche, c'est la reception qui fait planter)

public void download(string file)
        {
            send(socket, "exit");
            Thread.Sleep(100);
            if (System.IO.File.Exists(file) == true)
            {
                System.IO.FileInfo infos_file = new System.IO.FileInfo(file);
                long size = infos_file.Length;
                send(socket, size.ToString());
                Thread.Sleep(100);
                StreamReader sr = new StreamReader(file);
                char[] c = null;
                while (sr.Peek() >= 0)
                {
                    c = new char[1024];
                    sr.Read(c, 0, c.Length);
                    string buf = new string(c);
                    send(socket, buf);
                    Thread.Sleep(500);
                    list.Items.Add(buf);
                }
                sr.Close();
                send(socket, "endoffile");
            }
            else
            {
                send(socket, "stop");
                Thread.Sleep(100);
                send(socket, "Le fichier demande n'existe pas !");
            }
        }

Et la reception :

int file_size = Convert.ToInt32(test);
                    progress.Maximum = file_size;
                    label_progress.Text = " 0 / " + file_size.ToString();
                    long size = 0;
                    string texte = "";
                    string directory = "download\";
                    while (string.Compare(texte, "endoffile") != 0)
                    {
                        Byte[] buffers = new Byte[1024];
                        stream.Read(buffers, 0, buffers.Length);
                        texte = System.Text.Encoding.ASCII.GetString(buffers);
                        if (string.Compare(texte, "endoffile") != 0)
                        {
                            write_file(directory + "test.txt", texte);
                            label_progress.Text = size.ToString() + " / " + file_size.ToString();
                            progress.Value += 1024;
                        }  

                    }

- mon second probleme est pour lister un arborescence distante, par exemple C:\, ca marche au niveau 1 et 2 et a partir du niveau 2 a chaque clique sur un noeud sa me remet les meme fichiers/repertoire et je ne vois pa l'erreur : Voila mes fonctions :

private void maj_tree_Click(object sender, EventArgs e)
        {
            tree.Nodes.Add("C:");
            Explor(tree.Nodes[0], stream);
        }
        private void tree_AfterExpand(object sender, TreeViewEventArgs e)
        {
            foreach (TreeNode z in e.Node.Nodes)
            {
                list.Items.Add(z.Text);
                Explor(z, stream);
            }
        }

        private void Explor(TreeNode Node, NetworkStream stream)
        {
            Node.Nodes.Clear();
            string request = Node.FullPath;
            list.Items.Add(request);
            request = request.Replace(" ", "#");
            if (func.path(request) == true)
            {
                func.send(stream, "list " + request);
                string texte = "";
                while (string.Compare(texte, "/list") != 0)
                {
                    Byte[] buffers = new Byte[1024];
                    stream.Read(buffers, 0, buffers.Length);
                    texte = System.Text.Encoding.ASCII.GetString(buffers);
                    texte.Replace("\0", "");
                    if (string.Compare(texte, "/list") != 0)
                    {
                        list.Items.Add("----" + texte);
                        Node.Nodes.Add(texte);
                    }
                }
                Thread.Sleep(100);
                th = new Thread(new ThreadStart(reception));
                th.Start();
                Thread.Sleep(50);
            }
        }

Je vous remerci d'avance.
Cordialement NeoKript

3 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
Bonjour,

"avec notification d'erreurs"
Et quelle est l'erreur en question ?

Sinon à première vue dans le code de réception il y a traitement systématique des données via
texte = System.Text.Encoding.ASCII.GetString(buffers);
ce qui doit effectivement donner une restitution relativement bizarre pour des fichiers binaires.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
18
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
22 avril 2010

Salut,
tu as raison, l'erreur viens bien de cette ligne : texte = System.Text.Encoding.ASCII.GetString(buffers); quand je la passe en commentaire le prog ne plante pas.
du coup, il ne faut pas que j'encode ce que je reçois, mais que j'envoie directement les bytes ?

Et pour le problème du treeview, tu as une idée ?

Merci
Cordialement
NeoKript
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
Heu non je n'ai pas tout compris sur ce coup là.
Juste une remarque : la ligne "texte.Replace("\0", "");" ne sert à rien vu que tu ne récupères pas son retour (le type String est immuable), et même sans celà j'ai du mal à voir quelle était l'intention.

Pour ton problème je pense que tu devrais remettre à plat ce que tu veux faire au lieu de tatonner dans le code, ça devrait te permettre de voir où tu as fait une erreur dans ton protocole de transfert d'informations.

/*
coq
MVP Visual C#
CoqBlog
*/