Loupe

[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:

image

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é! Smile

 

 

Happy coding!

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus