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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top