【问题标题】:Clear image cache created by <Image>清除 <Image> 创建的图像缓存
【发布时间】:2015-07-14 07:10:07
【问题描述】:

如果我在 Windows 应用商店或 Windows Phone 应用程序中有这样的元素:

<Image Source="{Binding UrlToWebServer}" />

图像在本地缓存。这很棒。但是如何从代码中删除磁盘上所有缓存的图像?

【问题讨论】:

  • 您在哪里找到缓存在光盘上的图像。据我所知,XAML 框架会关联 URI 以避免多次解码一个图像,但它不会将 Web 图像缓存到磁盘。
  • 如果我将设备置于飞行模式并重新启动我的应用程序,图像仍会加载,因此它们必须存储在某个地方。我在 {User}\AppData\Local\Packages\{PackageName}\AC\INetCache 中找到了我的文件。磁盘清理似乎能够删除这些文件,但如果我也能从我的应用程序中删除这些文件会很好。

标签: windows-runtime windows-store-apps windows-phone-8.1


【解决方案1】:

您只需将图像源设置为 NULL

类似这样的:

BitmapImage bitmapImage = myimage.Source as BitmapImage;
bitmapImage.UriSource = null;
myimage.Source = null;

这对我有用。 Here 你可以找到处理图像的 mor infos(例如图像缓存部分)。

【讨论】:

  • 嗯……真的吗? :-) 我知道图像会从屏幕上消失,但它也会从光盘中删除吗?我还想删除所有缓存的图像,而不是单个元素(我已经澄清了我的问题)。
  • 嗯.. 我不知道如何一次清除所有缓存的图像。我发布的代码 sn-p 只是帮助我解决了一些内存问题。
  • 如果所有图像都使用相同的BitmapImage 或相同的UriSource,那么将它们设置为 null 将告诉垃圾收集器它们应该从 ram 中删除......所以这应该有效.
【解决方案2】:

您好,回答这个问题有点晚了,但是您可以使用这个类来删除特定文件的缓存,或者如果需要,可以删除所有文件

这是类助手

 class CacheCleanup : IDisposable
{
    private DispatcherTimer cleanCacheTimer;
    public CacheCleanup(TimeSpan? cleanInterval = null)
    {
        if (!cleanInterval.HasValue)
            cleanInterval = TimeSpan.FromMinutes(0.2);

        cleanCacheTimer = new DispatcherTimer();
        cleanCacheTimer.Interval = cleanInterval.Value;
        cleanCacheTimer.Tick += CleanCacheTimer_Tick;
        cleanCacheTimer.Start();
    }

    private void CleanCacheTimer_Tick(object sender, object e)
    {
        try
        {
            StorageFolder localDirectory = ApplicationData.Current.LocalFolder;
            string[] tmpCacheDirectories = Directory.GetDirectories(localDirectory.Path + "\\..\\ac\\inetcache");
            foreach (string dir in tmpCacheDirectories)
            {
                string[] tmpCacheFilesPng = Directory.GetFiles(dir, "*.png");
                foreach (string file in tmpCacheFilesPng)
                {

                        try
                        {
                            File.Delete(file);
                            Debug.WriteLine("Deleted png: " + file);
                        }
                        catch (Exception) { }
                }
                string[] tmpCacheFilesJpg = Directory.GetFiles(dir, "*.jpg");
                foreach (string file in tmpCacheFilesJpg)
                {

                    try
                    {
                        File.Delete(file);
                        Debug.WriteLine("Deleted jpg: " + file);
                    }
                    catch (Exception) { }
                }
            }
        }
        catch (Exception ex) { Debug.WriteLine("ERROR CLEANING CACHE: " + ex.Message); }
    }

    public void Dispose()
    {
        if (cleanCacheTimer != null)
        {
            cleanCacheTimer.Stop();
            cleanCacheTimer = null;
        }
    }
}

这就是你如何在你的 c# 代码的某些部分调用这个类的方式

CacheCleanup cacheCleanup = new CacheCleanup();

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多