Guide pratique : Effectuer une conversion entre les flux .NET Framework et les flux Windows Runtime (Windows uniquement)
.NET Framework pour les applications UWP est un sous-ensemble du .NET Framework complet. En raison de la sécurité et d’autres spécifications des applications UWP, vous ne pouvez pas utiliser l’ensemble d’API .NET Framework pour ouvrir et lire des fichiers. Pour plus d’informations, consultez Vue d’ensemble de .NET pour les applications UWP. Toutefois, vous pouvez utiliser des API .NET Framework pour les autres opérations de manipulation des flux. Pour manipuler ces flux, vous pouvez convertir un flux .NET Framework, tel que MemoryStream ou FileStream, en flux Windows Runtime tel que IInputStream, IOutputStream ou IRandomAccessStream.
La classe System.IO.WindowsRuntimeStreamExtensions contient des méthodes qui rendent ces conversions plus faciles. Toutefois, il existe des différences sous-jacentes entre les flux .NET Framework et Windows Runtime qui affecteront les résultats obtenus lors de l’utilisation de ces méthodes, comme l’expliquent les sections suivantes :
Convertir un flux Windows Runtime en flux .NET Framework
Pour convertir un flux Windows Runtime en un flux .NET Framework, utilisez l’une des méthodes System.IO.WindowsRuntimeStreamExtensions suivantes :
WindowsRuntimeStreamExtensions.AsStream convertit un flux d’accès aléatoire Windows Runtime en un flux managé dans .NET pour les applications de plateforme Windows universelle (UWP).
WindowsRuntimeStreamExtensions.AsStreamForWrite convertit un flux de sortie dans Windows Runtime en un flux managé dans .NET pour les applications de plateforme Windows universelle (UWP).
WindowsRuntimeStreamExtensions.AsStreamForRead convertit un flux d’entrée dans Windows Runtime en un flux managé dans .NET pour les applications de plateforme Windows universelle (UWP).
Windows Runtime propose des types de flux qui prennent en charge la lecture seule, l’écriture seule et la lecture-écriture. Ces fonctionnalités sont conservées lorsque vous convertissez un flux Windows Runtime en flux .NET Framework. En outre, si vous convertissez un flux Windows Runtime en un flux .NET Framework et inversement, vous obtenez l'instance du Windows Runtime en retour.
Il est recommandé d’utiliser la méthode de conversion qui correspond aux fonctionnalités du flux Windows Runtime que vous souhaitez convertir. Toutefois, comme IRandomAccessStream est accessible en lecture et en écriture (il implémente IOutputStream et IInputStream), les méthodes de conversion conservent les fonctionnalités du flux d’origine. Par exemple, l’utilisation de WindowsRuntimeStreamExtensions.AsStreamForRead pour convertir IRandomAccessStream n’empêche pas le flux .NET Framework converti d’être accessible en lecture. Il est également accessible en écriture.
Exemple : Convertir un flux d’accès aléatoire Windows Runtime en flux .NET Framework
Pour convertir un flux d’accès aléatoire Windows Runtime en un flux .NET Framework, utilisez la méthode WindowsRuntimeStreamExtensions.AsStream.
L’exemple de code suivant vous invite à sélectionner un fichier, l’ouvre à l’aide des API Windows Runtime, puis le convertit en flux .NET Framework. Il lit le flux et l’exporte vers un bloc de texte. En général, vous devez manipuler le flux à l’aide des API .NET Framework avant de sortir les résultats.
// Create a file picker.
FileOpenPicker picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
picker.ViewMode = PickerViewMode.List;
picker.FileTypeFilter.Add(".txt");
// Show picker, enabling user to pick one file.
StorageFile result = await picker.PickSingleFileAsync();
if (result != null)
{
try
{
// Retrieve the stream. This method returns a IRandomAccessStreamWithContentType.
var stream = await result.OpenReadAsync();
// Convert the stream to a .NET stream using AsStream, pass to a
// StreamReader and read the stream.
using (StreamReader sr = new StreamReader(stream.AsStream()))
{
TextBlock1.Text = sr.ReadToEnd();
}
}
catch (Exception ex)
{
// ...
}
}
Convertir un flux .NET Framework en flux Windows Runtime
Pour convertir un flux .NET Framework en un flux Windows Runtime, utilisez l’une des méthodes System.IO.WindowsRuntimeStreamExtensions suivantes :
WindowsRuntimeStreamExtensions.AsInputStream convertit un flux managé dans .NET pour les applications de plateforme Windows universelle (UWP) en un flux d’entrée dans Windows Runtime.
WindowsRuntimeStreamExtensions.AsOutputStream convertit un flux managé dans .NET pour les applications de plateforme Windows universelle (UWP) en un flux de sortie dans Windows Runtime.
WindowsRuntimeStreamExtensions.AsRandomAccessStream convertit un flux managé dans .NET pour les applications UWP en un flux d’accès aléatoire que Windows Runtime peut utiliser pour la lecture ou l’écriture.
Lorsque vous convertissez un flux .NET Framework en flux Windows Runtime, les fonctionnalités du flux converti dépendent de celles du flux d’origine. Par exemple, si le flux d’origine prend en charge la lecture et l’écriture, et que vous appelez WindowsRuntimeStreamExtensions.AsInputStream pour convertir le flux, le type retourné est un IRandomAccessStream
. IRandomAccessStream
implémente IInputStream
et IOutputStream
, et prend en charge la lecture et l’écriture.
Les flux .NET Framework ne prennent pas en charge le clonage, même après la conversion. Si vous convertissez un flux .NET Framework en flux Windows Runtime, et appelez GetInputStreamAt ou GetOutputStreamAt, qui appelle CloneStream, ou si vous appelez CloneStream directement, une exception est levée.
Exemple : Convertir un flux .NET Framework en flux d’accès aléatoire Windows Runtime
Pour convertir un flux .NET Framework en flux d’accès aléatoire Windows Runtime, utilisez une méthode AsRandomAccessStream, comme indiqué dans l’exemple suivant :
Important
Vérifiez que le flux du .NET Framework que vous utilisez prend en charge la recherche, ou copiez-le dans un flux qui la prend en charge. Vous pouvez utiliser la propriété Stream.CanSeek pour le déterminer.
// Create an HttpClient and access an image as a stream.
var client = new HttpClient();
Stream stream = await client.GetStreamAsync("https://learn.microsoft.com/en-us/dotnet/images/hub/featured-1.png");
// Create a .NET memory stream.
var memStream = new MemoryStream();
// Convert the stream to the memory stream, because a memory stream supports seeking.
await stream.CopyToAsync(memStream);
// Set the start position.
memStream.Position = 0;
// Create a new bitmap image.
var bitmap = new BitmapImage();
// Set the bitmap source to the stream, which is converted to a IRandomAccessStream.
bitmap.SetSource(memStream.AsRandomAccessStream());
// Set the image control source to the bitmap.
Image1.Source = bitmap;