[Windows (Phone)] Comment supprimer un fichier utilisé pour afficher une image ?
Je dois l’admettre, le titre n’est probablement pas le plus clair possible alors pour que vous y voyez un peu plus clair, voici un bout de code:
<Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Image Source="{Binding Image}" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" /> <Button Grid.Row="1" Content="Load Image" HorizontalAlignment="Center" VerticalAlignment="Center" Click="LoadImageButtonClick"/> <Button Grid.Row="2" Content="Delete Image" HorizontalAlignment="Center" VerticalAlignment="Center" Click="DeleteImageButtonClick" /> </Grid>
Ce XAML est tout simple, comme vous pouvez le constater alors regardons maintenant le ViewModel associé:
private string _image; public string Image { get { return _image; } set { _image = value; RaisePropertyChanged("Image"); } } public async Task LoadImage() { var httpClient = new HttpClient(); var logo = await httpClient.GetByteArrayAsync("http://www.infinitesquare.com/Content/images/theme/logo.png"); await SaveImageAsync(logo, await OpenOrCreateThumbnailAsync("logo")); this.Image = GetAppDataUrlThumbnailPathFor("logo"); } private async Task<IStorageFile> OpenOrCreateThumbnailAsync(string filename) { return await ApplicationData.Current.LocalFolder.CreateFileAsync(string.Format("{0}.png", filename), CreationCollisionOption.OpenIfExists); } private async Task SaveImageAsync(byte[] data, IStorageFile storageFile) { await FileIO.WriteBytesAsync(storageFile, data); } public string GetAppDataUrlThumbnailPathFor(string filename) { return string.Format("ms-appdata:///local/{0}.png", filename); } public async Task DeleteImage() { var file = await OpenOrCreateThumbnailAsync("logo"); await file.DeleteAsync(); }
Sur le Click du premier bouton, je télécharge un fichier que je stocke dans le répertoire ApplicationData de l’application puis, j’utilise le nom du fichier et la syntaxe “ms-appdata”) pour y accéder et mettre ce fichier dans mon controle image. Au moment où je souhaite supprimer le fichier, j’accède au StorageFile et j’appele sa méthode DeleteAsync qui me déclenche cette exception:
En fait, cette erreur est logique. En effet, même si vous n’utilisez pas directement le StorageFile, le fichier sous-jacent est, lui, utilisé par le contrôle Image pour afficher son contenu !
La solution est donc très simple: avant de supprimer le fichier, il faut cesser de l’utiliser (directement ou indirectement). Dans notre cas, cela va se représenter par le fait de passer à null la source de notre contrôle Image:
public async Task DeleteImage() { this.Image = string.Empty; var file = await OpenOrCreateThumbnailAsync("logo"); await file.DeleteAsync(); }
Et le tour est joué!
Happy coding!
Commentaires