2011-04-18 11 views
1

Je dois faire une méthode qui génère un binaire (4 octets de long), reçoit la liste des entiers et écrit cette liste un par un dans le fichier. Donc, j'ai ceci:Comment générer un fichier binaire? C#

public void FrameCodesBinaryWriter(List<int> frameCodes) 
{ 
    using (FileStream fileStream = new FileStream(binaryFilePath, FileMode.Create)) // destiny file directory. 
    { 
     using (BinaryWriter binaryWriter = new BinaryWriter(fileStream)) 
     { 
      for (int i = 0; i < frameCodes.Count; i++) 
      { 
       binaryWriter.Write(frameCodes[i]); 
      } 
      binaryWriter.Close(); 
     } 
    } 
} 

est-ce correct? ou une autre solution s'il vous plaît

+4

Est-ce que vous nous testez? Vous pouvez savoir si c'est correct - que s'est-il passé quand vous l'avez testé? – Hogan

+0

le fichier est généré, mais je veux seulement m'assurer que c'est correct – ale

+1

Astuce: vous n'avez pas besoin d'appeler explicitement Close() sur 'binaryWriter'. L'instruction 'using' prend soin de faire cela correctement. –

Répondre

0

Vous n'avez pas besoin de fermer binaryWriter parce que vous avez une clause using de toute façon. binaryFilePath doit être un champ de la classe, à part ça ça a l'air ok.

1

Comme c'est le cas, cela devrait fonctionner correctement. Voici une version refactorisée, vous pouvez choisir quels morceaux du refactoring vous aimez.

public void WriteFrameCodesAsBinary(IEnumerable<int> frameCodes) 
{ 
    using (FileStream fileStream = new FileStream(binaryFilePath, FileMode.Create)) 
    using (BinaryWriter binaryWriter = new BinaryWriter(fileStream)) 
    { 
     foreach (int frameCode in frameCodes) { 
      binaryWriter.Write(frameCode); 
     } 
    } 
} 

Je renomme la fonction pour décrire l'action qu'elle va effectuer. FrameCodesBinaryWriter ressemble plus à un nom de classe pour moi.

Si vous n'avez pas besoin de la commande du List<T>, il peut être une bonne idée d'accepter un IEnumerable<T> à la place. De cette façon, vous pouvez être plus flexible sur ce que vous passez.

Certaines personnes aiment empiler leurs instructions d'utilisation pour supprimer une couche d'imbrication (indentation de code). Personnellement, je ne suis pas un grand fan de ceci, mais c'est une question de goût personnel et de style. L'utilisation d'un IEnumerable<T> nous oblige à utiliser , mais même avec List<T>, il peut sembler plus propre/rendre plus évident que vous parcourez la liste.

Comme mentionné précédemment, si vous utilisez using, vous n'avez pas besoin de fermer explicitement le writer binaire - cela sera fait automatiquement lorsque le bloc using sera fermé.

Questions connexes