2012-06-08 7 views
-1

J'essaye de crypter une chaîne et de l'écrire dans un fichier binaire. Je veux faire le processus en sens inverse. Voici le code que j'ai mais ça ne marche pas.Ecrivez dans un fichier binaire avec C#

FileStream stream = new FileStream(saveFileDialog1.OpenFile().ToString(), FileMode.Create); 
BinaryWriter writer = new BinaryWriter(stream); 
String temp = ""; 
serialList.ForEach(delegate(record p) 
{ 
    temp = String.Format("{0},{1}#", p.serial, p.option); 
    byte[] dataB = System.Text.Encoding.Unicode.GetBytes(String.Format("{0},{1}#", p.serial, p.option)); 
    byte[] enc = Encrypt(dataB, "gio!"); 
    writer.Write(enc); 
}); 
writer.Write('1'); 
writer.Close(); 
stream.Close(); 

Qu'est-ce qui ne va pas?

+0

Que fait-il? – zmbq

+0

@zmbq: Crée un fichier vide, comme le dit la question. –

+0

Vous n'avez même pas le '1'? – zmbq

Répondre

6

SaveFileDialog.OpenFile renvoie déjà l'objet Stream. Vous n'avez pas besoin de l'appel étrange .ToString() qui peut ou peut ne pas vous donner le nom de fichier/chemin complet du fichier. Essentiellement votre code crée 2 flux: un à l'emplacement spécifié dans FileOpenDialog, et un autre - quelque part au chemin relatif avec le nom de fichier égal au résultat de "Stream.ToString()". Le premier flux (celui que vous regardez probablement) sera vide, car vous n'écrivez rien.

Remarque: pensez à utiliser using(...) au lieu des appels manuels .Close car cela crée un code plus sûr (vous ne laisserez pas de flux non disposés en cas d'exception).

2

Avant de fermer le flux, rincez-le comme ceci.

writer.Flush(); 
writer.Close(); 

Vous pouvez définir writer.AutoFlush true avant de commencer à écrire, mais peut-être un peu plus lent.

+2

+0. Conseils raisonnables, mais no-op: Close effectue Flush. Idem que d'appeler Dispose avec 'using' (ce qui ferait un meilleur code dans ce cas). –

+0

@AlexeiLevenkov: Je m'interrogeais à ce sujet, mais le code donné suggère qu'il n'est pas vidé. Intéressant. –