Read, Write File Binary

Résolu
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 - 24 janv. 2012 à 05:03
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 - 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

7 réponses

Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
25 janv. 2012 à 13:58
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 ?
3
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
24 janv. 2012 à 06:17
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)
0
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
24 janv. 2012 à 10:15
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)
0
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
24 janv. 2012 à 16:52
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
24 janv. 2012 à 19:19
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
0
Guillamue06 Messages postés 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
24 janv. 2012 à 19:41
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 !
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
24 janv. 2012 à 20:51
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
0
Rejoignez-nous