none
Fichier txt vide qui affiche un contenu... mystère ? RRS feed

  • Question

  • Bonjour,

    J'ai un problème mystérieux sur la taille du contenu d'un fichier...

    OS Seven 64 - PC

    Si je crée un fichier vide, la taille de son contenu est bien de 0 octet.

    Mais... si je crée comme susdit, puis que j'écris dedans et ensuite l'efface, le fichier affiche un contenu de 3 octets, quoi que je fasse et bien que vide ?

    Voici la photo, on voit dans mon éditeur de code les 3 octets.

    On voit aussi que via l'OS->propriété j'ai aussi 3 octets.

    Alors vous pouvez charger ce fichier zippé texte (3 octets.txt), et vous devriez voir que bien que vide il contient 3 octets ? Ici :

    Ici le lien zippé du fichier

    http://mesromans.free.fr/3 octets.zip

    Ceci est ennuyeux car ça crée un dysfonctionnement du test du contenu des fichiers, car si on vide un fichier, puis qu'on programme sur sa taille, et qu'en fait il persiste à contenir 3 octets dont ne sait où, ça pause problème...

    Y remédier serait simple, en supprimant puis recréant, mais le mieux serait de savoir pourquoi ça fait ça pour y remédier ?

    Au plaisir de vos lumières, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 17 septembre 2012 07:19

Réponses

  • Ou peut-être :

    Dim Vide as Boolean
    Using p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\coursePRcopie.txt"))
     Vide=p.EndOfStream
    End Using

    D'après ce que je vois, "vider" le fichier le met bien à la taille 0. Je n'obtiens les 3 octets que si je lance notepad et que j'enregistre en UTF-8 sans rien taper...



    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse EhJoe lundi 17 septembre 2012 12:42
    lundi 17 septembre 2012 11:10
    Modérateur

Toutes les réponses

  • Bonjour EhJoe,

    Voir http://fr.wikipedia.org/wiki/Indicateur_d%27ordre_des_octets#UTF-8. C'est un indicateur qui indique que c''est un fichier UTF-8. A priori :

    - soit revoir la façon dont le contenu du fichier est supprimé (quelle est la méthode actuelle ?)
    - soit revoir la façon dont on teste que le fichier est vide (en essayant de lire une ligne au lieu de tester sa taille)
    - ou si le but est de faire un éditeur binaire, c'est bien le comportement normal car le fichier contient effectivement ces 3 octets donc ne rien changer ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Proposé comme réponse Lyamine lundi 17 septembre 2012 08:09
    • Marqué comme réponse EhJoe lundi 17 septembre 2012 08:15
    • Non marqué comme réponse EhJoe lundi 17 septembre 2012 12:42
    lundi 17 septembre 2012 07:55
    Modérateur
  • Bonjour,

    Je suis de l'avis de Patrice, votre fichier est en UTF8.


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    lundi 17 septembre 2012 08:10
  • Bonjour Patrice,

    Ah, en effet... je ne savais pas... mais c'est ennuyeux ça, car ça signifie que LOF et LenFile ne servent plus à rien tant qu'ils n'auront pas été modifiés pour tenir compte de cette notation...

    Ainsi on ne peut plus se fier à une demande de longueur de fichier, sauf à le lire à l'octet (peut être) ou ligne par ligne... bon, je le sais désormais, merci :o)

    Non, je ne fais pas d'éditeur de fichier, c'est déjà fait depuis longtemps, c'est le mien que j'affiche, sauf que je l'ai fait pour 32 bits en vb6, et que quand je lis certains fichiers l'affichage est faux, faudra que je me penche un jour sur le problème.

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse EhJoe lundi 17 septembre 2012 08:16
    • Non marqué comme réponse EhJoe lundi 17 septembre 2012 12:42
    lundi 17 septembre 2012 08:15
  • Bonjour Lyamine,

    Ben ça signifie que LOF et LenFile ne sont plus fiables, ça pose quand même un problème de programation pour celui qui ne le sait pas (dont je faisais partie), ou celui qui l'oublie. En plus quand on crée le fichier il est bien à 0, et ne se fixe à 3 qu'à partir du moment ou l'on écrit dedans. Ça signifie que dans un fichier vide si on écrit "A" et qu'on demande la longueur il retourne 4, il y a de quoi rester perplexe sur le moment, on saute sur son code pour voir ou est l'erreur...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 17 septembre 2012 08:23
  • Bonjour Patrice,

    Ah, en effet... je ne savais pas... mais c'est ennuyeux ça, car ça signifie que LOF et LenFile ne servent plus à rien tant qu'ils n'auront pas été modifiés pour tenir compte de cette notation...

    Ainsi on ne peut plus se fier à une demande de longueur de fichier, sauf à le lire à l'octet (peut être) ou ligne par ligne... bon, je le sais désormais, merci :o)

    Non, je ne fais pas d'éditeur de fichier, c'est déjà fait depuis longtemps, c'est le mien que j'affiche, sauf que je l'ai fait pour 32 bits en vb6, et que quand je lis certains fichiers l'affichage est faux, faudra que je me penche un jour sur le problème.

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    Si vous créez le fichier depuis Visual Studio, celui-ci le fait en UTF8 avec les 3 octets d'entête. Passez par Windows pour le créer vide.

    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    lundi 17 septembre 2012 08:23
  • Lyamine suite...

    Négatif, au moment de sa création par le code il fait 0, ce n'est qu'à la première écriture qu'il intègre le marquage de son codage.

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 17 septembre 2012 08:25
  • Patrice suite,

    Si je comprends bien désormais il faut faire ce qui suit pour tester le "vide" d'un fichier :

        Dim p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\coursePRcopie.txt"))
        Dim ctr As Integer = 0
        Dim txt As String = ""
        While p.Peek() >= 0
          txt = Trim(p.ReadLine())
          If Len(txt) > 0 And Len(txt) > ctr Then ctr = Len(txt)
        End While
        p.Close()
        If ctr = 0 Then
            MsgBox("Le fichier de restauration (CoursePRcopie.txt) est vide :", vbExclamation)
            Exit Sub
        End If
    

    --->  ?

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 17 septembre 2012 08:40
  • Patrice suite,

    Si je comprends bien désormais il faut faire ce qui suit pour tester le "vide" d'un fichier :

        Dim p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\coursePRcopie.txt"))
        Dim ctr As Integer = 0
        Dim txt As String = ""
        While p.Peek() >= 0
          txt = Trim(p.ReadLine())
          If Len(txt) > 0 And Len(txt) > ctr Then ctr = Len(txt)
        End While
        p.Close()
        If ctr = 0 Then
            MsgBox("Le fichier de restauration (CoursePRcopie.txt) est vide :", vbExclamation)
            Exit Sub
        End If

    --->  ?

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    Sinon vous pouvez utiliser FileInfo :

    Dim info as FileInfo = New FileInfo("<path">)
    If info.Length>0 Then
       'Il y a des informations
    End If

    Que faites-vous pour créer le fichier ?

    Avez-vous essayé de définir le stream en mode ASCII à l'enregistrement ?


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !



    • Modifié Lyamine lundi 17 septembre 2012 09:41
    lundi 17 septembre 2012 09:17
  • Ou peut-être :

    Dim Vide as Boolean
    Using p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\coursePRcopie.txt"))
     Vide=p.EndOfStream
    End Using

    D'après ce que je vois, "vider" le fichier le met bien à la taille 0. Je n'obtiens les 3 octets que si je lance notepad et que j'enregistre en UTF-8 sans rien taper...



    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse EhJoe lundi 17 septembre 2012 12:42
    lundi 17 septembre 2012 11:10
    Modérateur
  • Lyamine, suite (ter) :

    En réponse : Je fais ceci pour le créer le fichier :

    Dim p As New System.IO.StreamReader(My.Application.Info.DirectoryPath & "\coursePRcopie.txt")


    Ton code :

    Dim info As System.IO.FileInfo = New System.IO.FileInfo(My.Application.Info.DirectoryPath & "\coursePRcopie.txt")    
    MsgBox(info.Length)

    Me donne la longueur de 3 octets, même vide (mais après accès écriture), c'est pareil que

    FileLen() 
    LOF()


    Oui, on peut modifier le codage :

    ' Décodage (une des quatre possibilités) Dim p2 As StreamReader = New StreamReader(p, Encoding.Unicode) Dim p2 As StreamReader = New StreamReader(p, Encoding.UTF7) Dim p2 As StreamReader = New StreamReader(p, Encoding.UTF8) Dim p2 As StreamReader = New StreamReader(p, Encoding.UTF32)

    ' Travail inPut/outPut avec : p2


    Mais à chaque fois que j'ai bidouillé avec ça, je n'ai eu que des catastrophes, car par exemple, en changeant de codage tu peux supprimer les accents, mais une fois enregistré, ben ce n'est pas réversible, tu ne récupères plus tes accents... même en changant de codage...

    C'est pour ça que je n'aime pas toucher au codage, ça peut provoquer de gros ennuis...

    Bon, c'est pas grave maintenant que je sais j'y penserais à tester de façon à ne pas me faire avoir avec des octets pseudo-fantômes.

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe lundi 17 septembre 2012 12:05 Un rajout
    lundi 17 septembre 2012 12:02
  • Patrice, suite (ter),

    Exactement ! Pour tester en situation je ne m'amuse pas à faire 10 lignes de code juste pour vider un fichier, je le vide à la main avec NotePad. Donc ça proviendrait de là... intéressant... L'OS coderait de façon différente de l'éditeur vbNet, ah...

    Ben merci de ces indications, ce qui pour autant n'est pas plus réjouissant, faut faire du code pour vider un fichier, juste pour le tester...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 17 septembre 2012 12:12
  • Patrice, suite (ter),

    Exactement ! Pour tester en situation je ne m'amuse pas à faire 10 lignes de code juste pour vider un fichier, je le vide à la main avec NotePad. Donc ça proviendrait de là... intéressant... L'OS coderait de façon différente de l'éditeur vbNet, ah...

    Ben merci de ces indications, ce qui pour autant n'est pas plus réjouissant, faut faire du code pour vider un fichier, juste pour le tester...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    Alors pour créer un fichier vide (je parle biensur de créer sur disque), vous pouvez faire :

    File.Create("<path>").Close()

    --> Ce cas créer un fichier type binaire.

    Il y a aussi :

    File.CreateText("<path>").Close()

    --> Ce cas créer un fichier texte en UTF8


    Si vous souhaitez le vider un fichier existant, vous pouvez le faire de la manière suivante :

    File.Open("<path>", FileMode.Truncate).Close()

    Par défaut je crois que l'Encoding utilisé dans .Net est celui du système.


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !


    • Modifié Lyamine lundi 17 septembre 2012 12:22
    lundi 17 septembre 2012 12:19
  • J'imagine que Notepad enregistre ce "prologue" même si le fichier est "vide" ce qui lui permet en le réouvrant de voir que c'est un fichier au codage UTF-8 (ou tout autre codage supporté par Notepad et demandé éventuellement par l'utilisateur à l'enregistrement) et de garder ce même format à l'enregistrement après saisie d'un contenu ce qui serait impossible si le fichier était totalement vide.

    Le problème est que l'on a tendance à considérer comme vrai qq chose qui l'est à 95 % (et ici je n'y aurais pas pensé non plus). Donc comme un fichier Word ou Excel, même un fichier "texte" peut-être sans contenu sans avoir pourtant une longueur de 0 octets.

    D'où ma proposition qui consiste à vérifier que le stream est vide (ce qui est ce que l'on veut vraiment savoir) plutôt que de considérer que le stream est vide parce que la longueur du fichier est à 0. Je retiens ce cas comme un bon cas de figure.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mercredi 19 septembre 2012 09:56
    Modérateur
  • Bonjour,

    Juste à propos de Notepad, il propose 4 types d'encodage lors de l'enregistrement. Pour un fichier vide :

    • ANSI :                       taille = 0 octets
    • Unicode :                  taille = 2 octets -> FF FE
    • Unicode Big Endian : taille = 2 octets -> FE FF
    • UTF8 :                       taille = 3 octets -> EF BB FF

    par défaut il enregistre en ANSI. Un article assez complet : Byte Order Mark


    Cordialement, Jacques

    mercredi 19 septembre 2012 11:34
  • Bonjour,

    Juste à propos de Notepad, il propose 4 types d'encodage lors de l'enregistrement. Pour un fichier vide :

    • ANSI :                       taille = 0 octets
    • Unicode :                  taille = 2 octets -> FF FE
    • Unicode Big Endian : taille = 2 octets -> FE FF
    • UTF8 :                       taille = 3 octets -> EF BB FF

    par défaut il enregistre en ANSI. Un article assez complet : Byte Order Mark


    Cordialement, Jacques


    Voir aussi Byte order mark

    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    mercredi 19 septembre 2012 13:00