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

VB.NET Discussion :

[VB.NET] Integrer le nom du fichier à l'envoi


Sujet :

VB.NET

  1. #1
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut [VB.NET] Integrer le nom du fichier à l'envoi
    Bonjour toute le monde,

    je fais un programme de transfert de fichiers d'un pc à un autre en utilisant le protocole TCP, ce dernier fonctionne et il transmet le fichier comme prévu mais le problème c'est que je dois définir à chaque fois le nom du fichier des deux coté (Envoi/Réception) et ça devient énervant !

    j'aimerais seulement pouvoir transférer des fichiers sans avoir à saisir leur nom à chaque fois

    Voici le code que j'utilise;

    -Envoi :

    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
     
    Public Class Form1
     
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
     
            SendFile()
     
        End Sub
     
        Private Shared Sub SendFile()
            Using tcpClient As New TcpClient("127.0.0.1", 80)
                Using networkStream As NetworkStream = tcpClient.GetStream()
     
     
                    Dim dataToSend As Byte() = File.ReadAllBytes("D:\SentFile.zip")
     
                    networkStream.Write(dataToSend, 0, dataToSend.Length)
     
                    networkStream.Flush()
     
     
                End Using
     
                tcpClient.Close()
     
            End Using
     
     
        End Sub
     
     
     
    End Class
    -Réception :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Public Class Form1
        Dim localAddress As IPAddress = IPAddress.Any
        Dim port As Integer = 80
        Dim tcpListener As New TcpListener(localAddress, port)
        Dim thread_réception As New Thread(AddressOf Listen)
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
     
            thread_réception.Start()
     
     
        End Sub
     
        Private Sub Listen()
     
            Try
     
     
                tcpListener.Start()
     
     
                While True
     
     
                    Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
     
     
                    Dim networkStream As NetworkStream = tcpClient.GetStream()
     
     
                    Dim stream As Stream = New FileStream("D:\Fichier_Reçu.zip", FileMode.Create, FileAccess.ReadWrite)
     
                    Dim bytes As [Byte]() = New [Byte](1023) {}
     
                    Dim length As Integer = networkStream.Read(bytes, 0, bytes.Length)
     
     
                    While length > 0
     
     
                        stream.Write(bytes, 0, length)
                        length = networkStream.Read(bytes, 0, bytes.Length)
     
                    End While
     
     
                    stream.Close()
     
                    tcpClient.Close()
     
     
     
                End While
     
                tcpListener.Stop()
     
     
            Catch e As SocketException
     
                MsgBox(e.ToString)
     
            End Try
     
        End Sub
     
     
        Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
     
            tcpListener.Stop()
            thread_réception.Abort()
     
     
        End Sub
    Voila, Merci bien votre aide !

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Salut,

    alors je ne parle pas VB... J'espère que tu pourras l'adapter.... ou si tu n'y arrives pas que quelqu'un de sympa le fera pour toi ^^

    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
     
    const int TAILLE_ENTETE_NOM_FICHIER_OCT = 100;
     
    			/*Fonction d'envoi*/
    			{
    				string cheminVersFichier = "C:/nomdetonfichier.xxx";
    				if (!File.Exists(cheminVersFichier))
    				{
    					throw new ArgumentException("Le fichier spécifié est introuvable : " + cheminVersFichier);
    				}
    				List<byte> tampon = new List<byte>();
    				var t1 = Encoding.UTF8.GetBytes(Path.GetFileName(cheminVersFichier));
    				if (t1.Length > TAILLE_ENTETE_NOM_FICHIER_OCT)
    				{
    					throw new ArgumentException("Le nom du fichier est trop long pour utiliser cette fonction...");
    				}
    				tampon.AddRange(t1);
    				while (tampon.Count != TAILLE_ENTETE_NOM_FICHIER_OCT)
    				{
    					tampon.Add(0);//0 pour combler
    				}
    				//le tampon contient maintenant le nom du fichier suivit qu'antant de 0 qu'il faut pour arriver à 100 octets
     
    				var t2 = File.ReadAllBytes(cheminVersFichier);
    				tampon.AddRange(t2);
    				//le reste de ta fonction pour envoyer
    			}
    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
    36
    37
     
    /*Fonction de réception*/
    			{
    				using (TcpClient client = new TcpClient()) // je reprends ta fonction d'ici --> chez toi '= tcpListener.AcceptTcpClient()'
    				{
    					using (NetworkStream stream = client.GetStream())
    					{
    						FileStream fs = null;
    						byte[] tampon = new byte[1024];
    						int nbOctetsLus = 0;//nombre d'octets utiles dans le tampon (pour la dernière lecture en fin de fichier))
    						while ((nbOctetsLus = stream.Read(tampon, 0, tampon.Length)) != 0)//transfert
    						{
    							if (fs == null)//première trame
    							{
    								if (nbOctetsLus < 100)//c'est la première trame et on n'a pas le nom du fichier à l'intérieur ?!!!
    								{
    									throw new FormatException("Le format de la trame envoyée n'était pas de la forme [100][N] avec [100] = nom du fichier sur 100 octets et [N] = Contenu du fichier sur N octets");
    								}
    								string nomFichier = Encoding.UTF8.GetString(tampon, 0, TAILLE_ENTETE_NOM_FICHIER_OCT);
    								fs = new FileStream(nomFichier, FileMode.CreateNew, FileAccess.Write);
     
    								byte[] reste = new byte[tampon.Length - TAILLE_ENTETE_NOM_FICHIER_OCT];
    								Buffer.BlockCopy(tampon, TAILLE_ENTETE_NOM_FICHIER_OCT, reste, 0, reste.Length);
    								tampon = reste;
    							}
    							fs.Write(tampon, 0, tampon.Length);
    						}
    						if(fs != null)
    						{
    							fs.Flush();
    							fs.Close();
    							fs.Dispose();
    							fs = null;
    						}
    					}
    				}
    			}
    Je n'ai pas testé le code; mais si j'avais dû répondre à la même problématique j'aurais fait comme ça. Peut-être que 100 octets n'est pas suffisant pour stocker le nom de ton fichier ? A toi de juger.
    En ASCII 1octets = 1caractère.
    En utf8... d'après ce que je lis c'est variable. Si c'est une caract simple (A B C D a b c d) c'est 1 octet aussi. Si c'est un peu plus étendu (é) c'est 2 octets. Dans tous les cas c'est max 4 octets. Donc dans le pire des cas tu peux encoder un nom de fichier qui contient 25 caractères.

    Dernier petit conseil : ne mets pas ton code direct derrière la fonction callback d'un clic sur bouton !!!
    Ce genre de code tu t'en resserviras tout le temps. Donc fais une petite classe MonTcpClientAMoi avec trois fonctions Ouvrir(IPAdress ip, int pPort) et Envoi(string pCheminVersFichier) Fermer() à minima.
    Si tu as le temps, mais c'est plus compliqué, tu fais la classe MonTcpServeurAMoi et là y'a les fonctions Depart / Arret /private Listen et un événement OnFichierRecu(string pCheminVersFichier) à qui est déclenché lorsque tu as fini la réception. Pratique pour faire remonter à ta classe appelante la répétition du fichier.
    C'était la minute conseil du vendredi

    A bientôt. Tiens nous au courant si ça fonctionne.

  3. #3
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    Bonsoir lead8209,

    Merci pour ta réponse, j'ai essayé de le convertir en VB.net mais ça met des erreurs, et en l'accordant avec mon code j'ai l'Exception "Le format de la trame envoyée n'était pas de la forme [100][N] avec [100] = nom du fichier sur 100 octets et [N] = Contenu du fichier sur N octets") !
    et pour ce qui de l'envoi du fichier je ne sais pas où mettre le nom voici comment j'ai procédé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    networkStream.Write(t2, 0, t2.Length) ' ça ne change rien du code précédent puisque t2 représente le fichier !

    En tous cas merci bcp pour ta réponse !

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    dans le principe le tcp te permet d'envoyer des octets
    il ne sert pas à différencier ce que sont ces octets

    c'est donc à toi de créer une norme d'envoi
    par exemple :
    sur 4 octets (integer) longueur nom du fichier (filename.length)
    sur 4 octets nombre d'octets du fichier (.count)
    nom du fichier (donc genre monfichier.txt de l'ascii transformé octet)
    octets du fichier

    ainsi à la réception, en lisant les 8 premiers octets tu saurais ensuite comment découper le reste, à savoir réussir à ne lire que le nom du fichier, et savoir combien d'octets il y a à lire pour avoir tout le fichier

    ce n'est qu'un exemple, tu peux créer ta norme comme tu le souhaites (et intégrer autre chose, comme la date de dernière modification etc...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    Salut Pol63,

    merci pour la réponse, c'est ce que j'essaye de faire (envoyer le nom du fichier en 1er lieu) comme l'avait dit "lead8209" mais même si je réussie je dois faire quoi coté réception pour que le serveur distingue le nom du fichier en lui même ?

    Merci !

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    je viens de le dire
    dans mon exemple il faut lire les 8 premiers octets, puis la suite
    si tu mets un buffer de 8 octets tu ne liras que les 8 premiers
    ou si tu lis tout, il faut alors regarder les 8 premiers
    et tu découpes en 4 et 4 pour avoir la taille de chaque morceau
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    bonjour,

    j'ai beau essayé d'inventer des codes qui conviennent mais je trouve pas, j'ai très bien compris votre schéma mais j'arrive pas à la mettre en œuvre
    j'ai toujours aussi cette erreur (Caractères non conformes dans le chemin d'accès.)

    voici le code :

    -Envoi

    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
    36
     
    Const TAILLE_ENTETE_NOM_FICHIER_OCT As Integer = 100
     
        Private Sub SendFile()
     
            Dim tcpClient As New TcpClient("127.0.0.1", 80)
            Dim networkStream As NetworkStream = tcpClient.GetStream()
     
            Dim cheminVersFichier As String = "D:\SentFile.zip"
     
            Dim tampon As New List(Of Byte)()
            Dim t1 = Encoding.UTF8.GetBytes(Path.GetFileName(cheminVersFichier))
            If t1.Length > TAILLE_ENTETE_NOM_FICHIER_OCT Then
                Throw New ArgumentException("Le nom du fichier est trop long pour utiliser cette fonction...")
            End If
     
            tampon.AddRange(t1)
            While tampon.Count <> TAILLE_ENTETE_NOM_FICHIER_OCT
                tampon.Add(0)
            End While
     
     
            Dim t2 = File.ReadAllBytes(cheminVersFichier)
            tampon.AddRange(t2)
     
     
     
            networkStream.Write(tampon.ToArray, 0, t2.Length)
     
     
            networkStream.Flush()
     
            tcpClient.Close()
     
     
        End Sub
    -Réception

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     Const TAILLE_ENTETE_NOM_FICHIER_OCT As Integer = 100
        Private Sub Listen()
     
            Try
     
                tcpListener.Start()
                Continuer = True
     
                While Continuer = True
     
     
                    If tcpListener.Pending Then
     
                        Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
                        Dim networkStream As NetworkStream = tcpClient.GetStream()
                        Dim tampon As Byte() = New Byte(1023) {}
                        Dim stream As FileStream = Nothing
                        Dim nomFichier As String = Encoding.UTF8.GetString(tampon, 0, TAILLE_ENTETE_NOM_FICHIER_OCT)
     
                        stream = New FileStream(nomFichier, FileMode.CreateNew, FileAccess.Write)
     
                        Dim reste As Byte() = New Byte(tampon.Length - TAILLE_ENTETE_NOM_FICHIER_OCT - 1) {}
     
                        Buffer.BlockCopy(tampon, TAILLE_ENTETE_NOM_FICHIER_OCT, reste, 0, reste.Length)
                        tampon = reste
     
                        stream.Write(tampon, 0, tampon.Length)
     
                        If stream IsNot Nothing Then
                            stream.Flush()
                            stream.Close()
                            stream.Dispose()
                            stream = Nothing
                        End If
     
                        tcpClient.Close()
     
     
                    Else
     
                        Thread.Sleep(100)
     
                    End If
     
                End While
     
                tcpListener.Stop()
     
     
            Catch e As SocketException
     
                MsgBox(e.ToString)
     
            End Try
     
        End Sub
    Merci !

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomfichier = nomfichier.Replace(Convert.ToChar(0),"")
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    Merci pour le code Graffito, mais ce n'est toujours pas résolu (Impossible de trouver une partie du chemin d'accès 'D:\test\'.)

    j'ai mis ton code comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nomfichier = nomfichier.Replace(Convert.ToChar(0),"")
    stream = New FileStream("D:\test\" & nomFichier, FileMode.CreateNew, FileAccess.Write)
    Merci !

  10. #10
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si le répertoire D:\test n'existe pas, il faut le créer.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  11. #11
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    Je ne crois pas que ça provienne du chemin d'accès parce que j'ai même essaye de créer le répertoire avec le code comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If System.IO.Directory.Exists("C:\halim") = False Then
                System.IO.Directory.CreateDirectory("D:\test")
            End If
    mais toujours le même problème !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2011, 12h03
  2. Capture nom de fichier pour envoi de mail avec PJ
    Par Graineur dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 15/03/2011, 13h45
  3. Réponses: 6
    Dernier message: 03/05/2006, 11h01
  4. [C++.net]Nom du fichier
    Par Dlyan dans le forum MFC
    Réponses: 12
    Dernier message: 02/03/2006, 10h43
  5. [VB.NET] Nom de fichier...
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 15
    Dernier message: 04/08/2004, 22h26

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