Copier, déplacer ... fichier en plusieurs partie [Résolu]

Signaler
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour,


J'aimerais savoir comment faire pour tranferer un fichier d'un PC à un autre comme le fait emule.

Pour la connection pas de problème, mon soucis est d'envoyer des
parties du fichier du PC distant sur un autre avec une gestion de
pause, et si la connection est interrompue, pouvoir recommencer le
téléchargement là ou il en était.


Je ne sais pas si c'est possible surtout pour les gros fichier (3Go) mais avec ecritureen binaire ?


Bref si vous avez compris mon problème merci de m'aider, me filer un lien de source...


Merci


ABF

8 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Re
Comme je l'ai dit plusieurs fois, apprends à lire des portions de fichier en mode Binary, dans des tableaux de Bytes.
Si tu veux gérer le fait de pouvoir poursuivre avec coupure, il faudra gérer un fichier mémoire qui listera les paquets manquants.
Avant de penser à optimiser, réalise le projet.
Si tu amènes une page d'un livre à un ami tous les jours, il faudra les ranger dans l'ordre pour savoir celles qui manquent : Imagine une telle organisation avec tes paquets de Bytes. Il faudra, c'est sûr, mémoriser les pages déjà reçues.
Une fois que tu auras mis au point le système d'entêtes des messages et leur relecture / interprétation côté client, il te sera facile d'en ajouter plus tard.
Projet intéressant.
Bon courage.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut
C'est une question d'organisation des transferts.
Il faut tout faire de A à Z :
- Taille des paquets
- Numérotation des paquets
- Identification du fichier et des paquets à l'émission pour les reconnaitre à la réception
- Création de fichiers temporaires pour chaque paquet
   ou formattage d'un fichier vide et le remplir au fur et à mesure que les paquets arrivent.

Dans ton projet, il y a deux thèmes qu'il faut connaitre parfaitement :
- le mécanisme de fonctionnement des Winsock et des buffers
- la lecture et écriture binaire des fichiers

Pour cela, il te suffit de charger quelques sources de transfert de fichier (ou de chat, le principe est le même) et d'analyser chaque source pour comprendre ce qui est fait à la réception, comment gérer le multi-clients, comment gérer l'arrivée de données en plusieurs fois ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

Salut, Je te remerci je vais regarder tous cela et si tu as une source
déjà "faite" traitant ce sujet pourrait tu me filer le lien ? J'ai
cherché pal mal cet aprèm sans source pour bien comprendre le mécanisme
et je t'avoue que je galère.


Merci encore

++


ABF
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Re
Je me suis peut-être mal exprimé : Ce n'est pas une question de programmation, mais d'organisation.
Tu découvriras cela en chargeant des sources qui parlent de Chat, mais il n'y a pas de règle, c'est à toi de les concevoir.
Je ne ta parle pas de l'écriture des fichiers, il te suffit de lire l'aide des fonctions Open, Get, Put, Binary, ...
Il faudra aussi que tu saches gérer l'étendue des varaibles que tu déclares. C'est la base de la programmation (les variables Public, Private, Dim dans les Sub ...)
Une fois que tu sauras tout sur ces deux sujets, tu pourras t'attaquer aux Winsock

Prenons l'exemple d'un Chat (le principe restera le même qqsoit l'application)
Tu vas devoir échanger des messages :
- Des messages texte émis par un utilisateur, bien sûr
- Des messages destinés au serveur, c'est à dire un dialogue entre le client et le serveur pour lui dire par exemple "passe en caractère gras", passe en caractères normaux" ...
Pour que, côté réception, tu saches ce que demande le client, il faut inventer un langage entre ton client et ton serveur :
Il suffit pour cela de créer des commandes rédéfinies, avec ce genre de balises :
#message#6#Coucou
#gras#
#normal#
J'ai choisi # (marqueur) pour séparer les mots clés, mais tu peux utiliser ce que tu veux, à condition que ce caractère soit unique et qu'il ne risque pas d'apparaitre dans un texte classique. Personnellement, j'utilise un Chr(0) comme marquur = un caractère impossible à taper au clavier.
Le but est de pouvoir repérer ce caractère facilement à la réception.
A la réception, la commande Split est très pratique pour découper les données

#message#6#Coucou
   Quand ton client veut envoyer le texte tapé par l'utilisateur
   Décryptage : 
      "message" : car il s'agit d'un message (bien trouvé, non ?)
      6 : parce que le message qui va suivre est composé de 6 caractères
      "Coucou" = le message tapé
   Côté réception, il te suffit de vérifier que le début des données commencent par #message#,
   tu sauras ensuite qu'il faut lire 6 caractères qui suivent, et ensuite, les afficher à l'écran.
#gras#
   Avec cette balise, tu sauras que les #message# qui suivent devront être écrit en gras
   A toi d'écrire le code qui fera cette action lorsqu'elle recevra cet ordre.
#normal#
   Une autre balise qui dira qu'il faut repasser l'affichage des texte en normal (pas gras) - Idem
----------------------------------------------------------------------------------
Dans ton cas, tu veux transférer des morceaux de fichier.
---> Commence par transférer un seul fichier en entier : tu verras déjà tous les pièges ! Tous ces pièges sont déjoués dans les applications que tu trouveras ici et qui parlent de ... transfert de fichier par winsock.
Il va donc falloir étiqueter tous les bouts de fichier que tu vas envoyer pour que, à la réception tu puisses les remettre dans le bon ordre.
Tout est dans ton imagination. Perso, je définirai des "balises" du genre :
#nom fichier#11#Fichier.txt      pour envoyer le nom du fichier
#taille totale#12623#                pour envoyer sa taille totale#paquet#1#14#qkjdkj hlkghlk   pour dire que c'est un paquet de données, n° du paquet 1, longueur des données de ce paquet 14
Il "suffira" de recoller les morceaux ...

Tu as un exemple ici (clique ici) de ce genre de balisage. C'est une de mes sources.
Attention, ce n'est pas du gateau, c'est un sujet complexe.
C'est pour cela que je conseille très fortement de commencer par le b.a.ba : Charge des applications qui parlent de Winsock et il faut impérativement que tu comprennes tout ce qui se passe dedans, sinon, tu ne pourras pas avancer dans ton projet.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

Re,


Merci.


Les controles winsock avec echanges de datas il n'y a pas de problème,
le seul soucis est d'avoir une visu de "comment faire pour" Télecharger
des parties de fichiers et si la connection s'interromp, reprendre le
telechargement là ou il en était sans perte de données.


On ouvre un fic sur le PC client en mode Binary et ensuite on envoie
des bits ? mon problème est de savoir qu'est ce que je dois envoyer
exactement : Lecture PC Serveur, Ecriture sur PC Client mais comment
"connaitre se que l'on a réellement envoyé, et comment est-ce découpé.
(j'ai bien saisi que la règle, c'est moi qui la détermine mais quel est
le moyen le plus optimisé, rapide et sûr ?)


Je me suis peux etre mal exprimé par manque de temps mais je pense que tu as compris (^_^)


++


ABF
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

RE,


Merci, je vais regarder tous cela. ++
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

Salut,


J'ai testé un truc mais lorsque je télécharge un fichier et bien il
n'ecrit que la taille octect du winsock (600 par défaut dans ton appli)
et n'envoie pas tous les bytes contenu dans le fichier pourtant je me
suis servis de ta source et d'autres sur VBFrance.

Pour l'instant je ne fais pas le Dl pas séquences, je le télécharge d'
"1 coup"  c'est a dire que je ne parse pas mon fichier à
chaque  tampon recu (600 octect) mais je les ajoute dans le même
fichier.

J'ai bien regardé, il ne réécrit pas par dessus les valeurs déjà inscrites.


Une petite aideseraitdonc la bienvenue stp

++
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut
Tu me disais en PV :
<hr />
J'ai réussis a faire le téléchargement seulement quand le téléchargement reprend et bien il ne doit pas prendre au bon byte.
J'ai testé avec une chanson etlorsque je la lit, elle sacade donc il y en manque des bouts ou il y a des espaces en trop.
Les variables sont bien sur déclarées
CLIENT:
WSDl.GetData valSock, vbString, bytesTotal
'On vérifie l'existance dossier
FicFinal = txtConfig(0).Text & IP & "" & FichierDL
If Dir$(txtConfig(0).Text, vbDirectory) = vbNullString Then MkDir (txtConfig(0).Text)
ff = FreeFile // si ya +ieurs Fic
Open FicFinal For Binary Access Write As #ff
        tFic = LOF(ff)        If tFic 0 Then tFic 4
        If LOF(ff) < tailleFic Then    's'il reste encore des octets à copier
            tFic = tFic - 3
            Put #ff, (tFic), valSock   'on ecrit ds le fichier
        End If
Close #ff
<hr />
Et je te répondrai, pour les 4ème fois :
Vulgarise toi avec la gestion de lecture / écriture de fichier
En méthode Put, il ne faut pas utiliser les Strings : Elles ont une longueur variable. On ne contrôle rien
Il faut lire les données sous forme d'un tableau de Bytes puis écrire ces Bytes :
    Dim bBuffer() As Byte
    wsClient.GetData bBuffer, vbByte, bytesTotal
...
    Put #ff, tFic, bBuffer

A quoi peut bien servir le "tFic = tFic - 3" ?
Pourquoi fais-tu / as-tu besoin / de tester la taille du fichier ?
Tant qu'il arrive des données, écris ces données. Pourquoi vouloir compliquer tout ?

Et c'est là qu'il faut D'ABORD savoir gérer les fichiers car tu te crées des problèmes là où il n'y en a pas (encore).
Par pitié : Excerce toi à faire des choses simples :
-1- Connaitre les types de variables et ce qu'elles représentent (String, Byte, comment passer de l'une à l'autre ...)
-2- Lecture de fichier : Prend un fichier texte quelconque et essaye de lire la 10ème lettre sous forme de byte
-3- Ecriture : Dans ce même fichier, remplace la 14ème lettre par un Byte de valeur 36 : Tu dois y voir un $ en mode texte.

Quand tu auras fais ces 3 excercices, les choses seront plus claires pour affronter l'échange de données avec Winsock.
S'il te plait, ne m'envoie pas de MP.
Je reçois un mail à chaque fois que tu réponds dans ce Post, mais désolé, j'ai d'autres occupations que de donner des conseils.
Si tu es pressé, charge des sources et essaye de les analyser : Tu as beaucoup à y apprendre.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)