Comment stocker un IStream à un fichier via C #?
Question
Je travaille avec une composante 3ème partie qui renvoie un objet IStream (System.Runtime.InteropServices.ComTypes.IStream). Je dois prendre les données dans ce IStream et écrire dans un fichier. J'ai réussi à obtenir ce fait, mais je ne suis pas vraiment satisfait du code.
"STRM" être mon IStream, voici mon code de test ...
// access the structure containing statistical info about the stream
System.Runtime.InteropServices.ComTypes.STATSTG stat;
strm.Stat(out stat, 0);
System.IntPtr myPtr = (IntPtr)0;
// get the "cbSize" member from the stat structure
// this is the size (in bytes) of our stream.
int strmSize = (int)stat.cbSize; // *** DANGEROUS *** (long to int cast)
byte[] strmInfo = new byte[strmSize];
strm.Read(strmInfo, strmSize, myPtr);
string outFile = @"c:\test.db3";
File.WriteAllBytes(outFile, strmInfo);
Au moins, je ne l'aime pas longtemps int jeté comme commenté ci-dessus, mais je me demande s'il n'y a pas une meilleure façon d'obtenir la longueur du flux original que ce qui précède? Je suis un peu nouveau pour C #, donc merci pour tous les pointeurs.
La solution
Vous n'avez pas besoin de faire CAST, comme vous pouvez lire les données à partir des sources de IStream
en morceaux.
// ...
System.IntPtr myPtr = (IntPtr)-1;
using (FileStream fs = new FileStream(@"c:\test.db3", FileMode.OpenOrCreate))
{
byte[] buffer = new byte[8192];
while (myPtr.ToInt32() > 0)
{
strm.Read(buffer, buffer.Length, myPtr);
fs.Write(buffer, 0, myPtr.ToInt32());
}
}
De cette façon (si les travaux) est plus efficace de la mémoire, car il utilise juste un petit bloc de mémoire pour transférer des données entre que les flux.
Autres conseils
System.Runtime.InteropServices.ComTypes.IStream est une enveloppe pour ISequentialStream.
De MSDN: http://msdn.microsoft .com / fr-fr / bibliothèque / aa380011 (VS.85) .aspx
Le nombre réel d'octets lus peut être inférieur au nombre d'octets a demandé si une erreur se produit ou si le fin du flux est atteinte pendant l'opération de lecture. Le nombre de octets retournés doivent toujours par rapport au nombre d'octets demandé. Si le nombre d'octets retournés est inférieur au nombre de octets demandé, cela signifie généralement la méthode Read a tenté de lire le passé fin du flux.
Cette documentation indique que vous pouvez lire en boucle et aussi longtemps que pcbRead est à moins cb.