Read, Write File Binary [Résolu]

Guillamue06 158 Messages postés dimanche 18 avril 2004Date d'inscription 25 juillet 2018 Dernière intervention - 24 janv. 2012 à 05:03 - Dernière réponse : Guillamue06 158 Messages postés dimanche 18 avril 2004Date d'inscription 25 juillet 2018 Dernière intervention
- 25 janv. 2012 à 13:58
Bonjour, je cherche le moyen de transférer un fichier via tcpclient/tcplistener.

Voici la façon dont j'ouvre le fichier :

WriterFile = New FileStream(TextParcourir.Text, FileMode.Open)
Dim Reader As New BinaryReader(WriterFile)

Puis je li le fichier en boucle par 8 octets (j'ai pas trouvé plus rapide) :
While i <> Reader.BaseStream.Length
Dim Ligne = Reader.ReadInt64
i = i + 8
EnvoiMessage(Ligne)
End While

Ensuite les données récupérées sont écrites comme ceci :
WriterFile.Write(Encoding.UTF8.GetBytes(Recu), 0, Recu.Length)

(Sachant que WriterFile n'est pas le même objet que celui qui li le fichier, ceci m'évité de déclarer une autre variable)

Bref, le fichier n'est pas ecrit correctement.
Je pense que le souci se pose au niveau de Encoding.UTF8.GetBytes(Recu) qui ne doit pas reconvertir les données Recu en string vers du binaire..

Si une personne à une idée merci d'avance
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Guillamue06 158 Messages postés dimanche 18 avril 2004Date d'inscription 25 juillet 2018 Dernière intervention - 25 janv. 2012 à 13:58
3
Merci
Bonjour, oui lineInput li les données et les transforme en string.
Mais pourtant j'ouvre le fichier en mode binary puis je reconverti le lineInput en byte.

Pourquoi j'utilise pas de FileStream du genre :

Dim FileOpen = New FileStream("accept.png", FileMode.Open, FileAccess.Read)
Dim FileCreate = New FileStream("accept2.png", FileMode.Create, FileAccess.Write)

Dim Writer As New BinaryWriter(FileCreate)
Dim Reader As New BinaryReader(FileOpen)


Parce que ici Reader ne li pas le fichier ligne par ligne mais plutôt par bloque d'octets. Sa va être très long à transférer un fichier de 700mo...

De plus se qui me gène c'est que les FileStream ne s'ouvre pas en mode binary ici. Puis j'ai déja testé sur un fichier de 4ko (40 secondes pour le copié sur mon PC, et résultat pareil... Fichier illisible)

Entre nous, il me paressé plus logique d'ouvrir le fichier un mode binaire/Read via FileOpen puis réécrire le fichier via un autre FileOpen toujours en mode binaire/Write.

Puis a la limite encodé lineInput en byte. A quoi sert l'option OpenMode.Binary de FileOpen si on ne peut pas lire les données correctement ?

Merci Guillamue06 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Guillamue06
Guillamue06 158 Messages postés dimanche 18 avril 2004Date d'inscription 25 juillet 2018 Dernière intervention - 24 janv. 2012 à 06:17
0
Merci
J'ai un peut du mieu, pour la lecture j'ai utilisé la vielle méthode :

FileOpen(1, TextParcourir.Text, OpenMode.Binary, OpenAccess.Read)
While Not EOF(1)
Dim Ligne = LineInput(1)
EnvoiMessage(Ligne)
End While

Mais la ligne :
WriterFile.Write(Encoding.UTF8.GetBytes(Recu), 0, Recu.Length)

Ecrit toujours mal le fichier (je passe d'un fichier de 20ko a 70ko avec plein de caractère "NULL" quand je l'ouvre avec le bloc note)
Commenter la réponse de Guillamue06
Guillamue06 158 Messages postés dimanche 18 avril 2004Date d'inscription 25 juillet 2018 Dernière intervention - 24 janv. 2012 à 10:15
0
Merci
J'ai essayé plein de méthodes du genre :

Dim data As Byte() = UTF8Encoding.UTF8.GetBytes(Recu)
Writer = New BinaryWriter(FileCreate)
Writer.Write(data)

Mais rien n'y fait, le fichier est toujours mal écrit...

Note: Les données sont envoyée comme ceci :
Dim envoi As Byte() = Encoding.UTF8.GetBytes(donnees + vbCrLf)

Puis réceptionné :
Dim Recu As String = Encoding.UTF8.GetString(bytes, 0, bytes.Length)

FileCreate étant un fichier ouvert :
FileCreate = New FileStream(Recu.Split(" ")(1), FileMode.Create, FileAccess.Write)
Commenter la réponse de Guillamue06
Guillamue06 158 Messages postés dimanche 18 avril 2004Date d'inscription 25 juillet 2018 Dernière intervention - 24 janv. 2012 à 16:52
0
Merci
Je viens d'essayer depuis un autre formulaire donc sans passer par le réseau et il semblerai que se soit ma méthode qui ne fonctionne pas :

Private Sub Form4_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        FileOpen(1, "accept.png", OpenMode.Binary, OpenAccess.Read)

        Dim FileCreate = New FileStream("accept2.png", FileMode.Create, FileAccess.Write)
        Dim Writer As New BinaryWriter(FileCreate, UTF8Encoding.UTF8)

        While Not EOF(1)
            Writer.Write(LineInput(1) + vbCrLf)
        End While

        FileClose(1)
        FileCreate.Close()

        MsgBox("fini !")
    End Sub



L'écriture est mal faite en binaire...

Merci pour vos nombreux messages !
Commenter la réponse de Guillamue06
NHenry 14261 Messages postés vendredi 14 mars 2003Date d'inscription 21 septembre 2018 Dernière intervention - 24 janv. 2012 à 19:19
0
Merci
Bonjour,

Il faut faire attention au type de fichier, si ton fichier est de type binaire, l'envoyer sous format Texte n'est pas forcément une bonne idée.

Fais attention à cela à l'avenir.

Si ton pb est résolu, regardes le point 3 de ma signature.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Guillamue06 158 Messages postés dimanche 18 avril 2004Date d'inscription 25 juillet 2018 Dernière intervention - 24 janv. 2012 à 19:41
0
Merci
Bonjour, alors dans mon dernier message j'ai tester de réécrire un fichier en binaire que j'ai ouvert mode binaire sans passé par une connexion.

Le résultat est le même... Le fichier n'est pas réécrit correctement...

Bref, je cherche depuis la nuit dernière j'ai d'ailleurs posté a 5h du mat !

Se n'est pas une mauvaise volonté de ma part j'ai cherché partout sur Google...

Sur les langages C et les langages dérivé du C (Java, Python, C++....) Pas de problème on ouvre le fichier un mode binaire :

fich = open("fichier.exe", "r+b") puis ont réécrit en mode binaire :

fich2 = open("fichier.exe", "a+b")
fich2.write(ligne fichier 1)

Point bar ! La non... impossible de réécrire correctement un fichier ouvert en binaire vers du binaire...

J'insiste car j'ai fini mon application il me reste plus cas régler se problème et je ne souhaite pas abandonner mon projet (j'y est passé trop d'heure) pour un problème aussi banale dont même la MSDN ne sais répondre.

Je commence vraiment à avoir regretter VB6 dont on ne disposé pas de 36 millions de méthodes pour faire des choses très banales. Le C est devenu plus simple que le VB... Enfin plus logique disons !
Commenter la réponse de Guillamue06
NHenry 14261 Messages postés vendredi 14 mars 2003Date d'inscription 21 septembre 2018 Dernière intervention - 24 janv. 2012 à 20:51
0
Merci
Bonjour,

Pourquoi tu utilises FiloOpen, utilises directement 2 stream, un en lecture et un autre en écriture.
LineInput se limite à du texte, je crois.

Sinon, as-tu vérifier les modifications du fichiers ?
Cela te donnera peut être des pistes.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.