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

Framework .NET Discussion :

Insérer une ligne dans un fichier texte sans modifier l'encodage


Sujet :

Framework .NET

  1. #1
    Membre actif

    Inscrit en
    Novembre 2003
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 168
    Points : 232
    Points
    232
    Par défaut Insérer une ligne dans un fichier texte sans modifier l'encodage
    Bonjour,

    Je voudrais insérer une ligne au beau milieu d'un fichier texte, juste avant une ligne contentant "avant moi" par exemple. Le but c'est de modifier le contenu du fichier sans modifier son encodage.

    Voici le code que je compte utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim sw As New StreamWriter(New FileStream("C:\fichier.txt", FileMode.Open))
            sw.WriteLine("Voilà je suis une nouvelle ligne")
            sw.Close()
    Le problème c'est que la ligne est insérée au tout début du fichier ! Comment me déplacer à un endroit bien déterminé pour insérer ma ligne ?

    Pour ceux qui vont me proposer de créer un nouveau fichier et y mettre le contenu de l'ancien fichier + la ligne insérée je dis d'accord mais comment faire pour que le nouveau fichier ait le même encodage que l'ancien, car c'est ça l'objectif de toute la manoeuvre.

    Merci par avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Pour récupérer l'encodage de ton premier fichier, conserve ton code d'ouverture du premier fichier (avec la variable sw) et initialise le StreamWriter du "nouveau" fichier de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim sw2 As New StreamWriter(New FileStream("C:\fichier_nouveau.txt", FileMode.OpenOrCreate),sw.Encoding)
    Après, est-ce que tout réécrire dans un nouveau fichier en intercalant ta ligne est la meilleure solution, je ne sais pas...

  3. #3
    Membre actif

    Inscrit en
    Novembre 2003
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 168
    Points : 232
    Points
    232
    Par défaut
    J'ai bien peur que ce soit une mauvaise idée, car la propriété encoding des StreamReader et des StreamWriter est toujours (sauf si on la spécifie explicitement) à UTF8 même si l'encodage réel du fichier est différent !

    donc dans ton code j'aurais sw.encoding = UTF8 et non pas l'encodage du premier fichier !!!!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Ok donc la méthode d'ouverture n'arrive pas à détecter l'encodage du fichier...

    J'ai fait quelques recherches rapides, et je suis rapidement tombé sur un source, je te laisse juger :
    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
        * using System.Text;
        * using System.IO;
        *
        * ....
        *
        *
        * /// <summary>
        * /// Permet de tester l'encodage utilisé pour le fichier texte dont le chemin est fourni
        * /// </summary>
        * /// <param name="CheminFichier">Chemin du fichier</param>
        * /// <returns>Encodage du fichier Texte</returns>
        * private Encoding ObtientENcoding(string CheminFichier)
        * {
        * Encoding enc = null;
        * FileStream file = new FileStream(CheminFichier, FileMode.Open, FileAccess.Read, FileShare.Read
        * if (file.CanSeek)
        * {
        * byte[] bom = new byte[4]; // Get the byte-order mark, if there is one
        * file.Read(bom, 0, 4);
        * if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) // utf-8
        * {
        * enc = Encoding.UTF8;
        * }
        * else if ((bom[0] == 0xff && bom[1] == 0xfe) || // ucs-2le, ucs-4le, and ucs-16le
        * (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff)) // ucs-4
        * {
        * enc = Encoding.Unicode;
        * }
        * else if (bom[0] == 0xfe && bom[1] == 0xff) // utf-16 and ucs-2
        * {
        * enc = Encoding.BigEndianUnicode;
        * }
        * else // ANSI, Default
        * {
        * enc = Encoding.Default;
        * }
        * // Now reposition the file cursor back to the start of the file
        * file.Seek(0, SeekOrigin.Begin);
        * }
        * else
        * {
        * // The file cannot be randomly accessed, so you need to decide what to set the default to
        * // based on the data provided. If you're expecting data from a lot of older applications,
        * // default your encoding to Encoding.ASCII. If you're expecting data from a lot of newer
        * // applications, default your encoding to Encoding.Unicode. Also, since binary files are
        * // single byte-based, so you will want to use Encoding.ASCII, even though you'll probably
        * // never need to use the encoding then since the Encoding classes are really meant to get
        * // strings from the byte array that is the file.
        *
        * enc = Encoding.Default;
        * }
        * return enc;
        * }
        *
        * ....

  5. #5
    Membre actif

    Inscrit en
    Novembre 2003
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 168
    Points : 232
    Points
    232
    Par défaut
    Merci, cet exemple se base sur le BOM (4 premiers octets du fichier) qui n'est pas forcément présent dans tous les fichiers textes. D'ailleurs, le principal but du BOM c'est d'indiquer si on est en Unicode little ou big endian et non pas de déterminer l'encodage.

    D'ailleurs, l'un des constructeurs de la classe StreamReader prend un paramètre booléen detectEncodingFromByteOrderMarks qui fait à peu près la même chose que le code que tu proposes, mais dans mon cas il détecte UTF-8 alors que l'encodage du fichier est Windows-1252 probablement parce que mon fichier ne contient pas de BOM !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Il me semblait aussi que ces 4 octets n'étaient pas présents dans tous les fichiers.

    Par ailleurs, je vois que tes compétences dans ce domaine sont supérieures au miennes, et je crains de ne pouvoir t'aider plus malheureusement

  7. #7
    Membre actif

    Inscrit en
    Novembre 2003
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 168
    Points : 232
    Points
    232
    Par défaut
    Citation Envoyé par Bib73 Voir le message
    Il me semblait aussi que ces 4 octets n'étaient pas présents dans tous les fichiers.

    Par ailleurs, je vois que tes compétences dans ce domaine sont supérieures au miennes, et je crains de ne pouvoir t'aider plus malheureusement
    Alors là tu me connais vraiment mal
    Merci en tous cas

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/06/2011, 17h35
  2. Réponses: 11
    Dernier message: 15/07/2009, 14h01
  3. Insérer une ligne d'un fichier texte dans une table
    Par Atemi76 dans le forum Administration
    Réponses: 1
    Dernier message: 10/07/2007, 17h32
  4. Supprimer une ligne dans un fichier text
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 14/03/2006, 16h43
  5. [VBA] insérer une ligne dans un fichier excel
    Par cokinoumasterflash dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2005, 18h52

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