4 votes

Comment vérifier si un flux C# est redimensionnable ?

De http://msdn.microsoft.com/en-us/library/system.io.memorystream%28v=VS.90%29.aspx :

Les flux de mémoire créés à l'aide d'un tableau d'octets non signés fournissent une méthode d'évaluation de la qualité des données. flux de données non redimensionnable. Lorsque vous utilisez un tableau d'octets, vous ne pouvez ni ajouter, ni réduire le flux, bien que vous puissiez être en mesure de modifier le contenu existant en fonction des paramètres passés dans le le constructeur. Les flux de mémoire vides sont redimensionnables, et peuvent être être écrits et lus.

Lorsqu'on lui fournit une référence à un MemoryStream (ou même simplement un Stream ), comment peut-on vérifier s'il est redimensionnable ?

La situation s'est présentée lors de l'utilisation du SDK OpenXML, qui exige que les flux qui lui sont transmis soient redimensionnables. Je peux garantir le redimensionnement en effectuant une copie profonde vers un flux redimensionnable, mais je me demande s'il y a une raison particulière pour laquelle la bibliothèque ne lève pas une exception lorsqu'un mauvais paramètre lui est transmis (c'est-à-dire un flux non redimensionnable).

2voto

mike z Points 14365

Voici une méthode plutôt moche où vous attrapez l'exception NotSupportedException lorsque vous essayez de redimensionner.

public static bool IsResizable(this Stream stream)
    {
        bool result;
        long oldLength = stream.Length;

        try
        {
            stream.SetLength(oldLength + 1);
            result = true;
        }
        catch (NotSupportedException)
        {
            result = false;
        }

        if (result)
        {
            stream.SetLength(oldLength);
        }

        return result;
    }

2voto

Scott Wegner Points 1773

Modifier la solution ci-dessous ne fonctionne pas pour les MemoryStreams qui ont été créés à l'aide de la fonction MemoryStream(byte[], int, int, bool, bool) avec le dernier paramètre publiclyVisible réglé sur true .


Según MSDN , MemoryStream.GetBuffer lancera un UnauthorizedAccessException si l'objet n'a pas été créé avec un "tampon visible par le public". Les constructeurs listés avec des tampons visibles publiquement correspondent aux mêmes constructeurs qui sont redimensionnables. Ainsi, vous pouvez vérifier que l'objet est redimensionnable en contrôlant GetBuffer :

public static bool IsResizable(this MemoryStream stream)
{
    if (stream == null) throw new ArgumentNullException("stream");

    bool resizable;
    try
    {
        stream.GetBuffer();
        resizable = true;
    }
    catch (UnauthorizedAccessException) { resizable = false; }

    return resizable;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X