从IsolatedStorageFile删除文件会导致" IsolatedStorageException:不允许操作"当锁屏图像想要更新时

时间:2015-01-05 12:01:59

标签: silverlight windows-phone-8 isolatedstorage lockscreen isolatedstoragefile

为Windows Phone 8.0 silverlight应用生成锁定屏幕图像时,我使用以下代码:

fileName = Guid.NewGuid() + ".jpg";

using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
{                            
    using (var isostream = iso.CreateFile(fileName))
    {
        Extensions.SaveJpeg(bmp, isostream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
        isostream.Close();
    }
}

当我运行应用程序或通过后台任务(假设锁定屏幕设置已启用)时,此功能完全正常。

我最近添加的代码会在我启动应用程序时运行,以便为了提高存储效率而删除以前的锁定屏幕图像。

这是App.xaml.cs中使用的代码:

using (var iso = IsolatedStorageFile.GetUserStoreForApplication() )
{
    foreach (string file in GetAllFiles("*.jpg", iso))
    {
        iso.DeleteFile(file);
    }

    iso.Dispose();
}

GetAllFiles方法是从http://msdn.microsoft.com/en-us/library/zd5e2z84%28v=vs.110%29.aspx复制的。

调试时工作正常;自上次启动应用程序以来创建的所有锁定屏幕图像都将成功删除。需要明确的是,应用程序存储的唯一jpg是锁定屏幕图像。

然而,问题是每当我确实包含此删除操作时,锁定屏幕图像从那一刻起停止更新。每当尝试更新它时,我都会收到此异常:

  

System.IO.IsolatedStorage.IsolatedStorageException:IsolatedStorageFileStream上不允许操作。      在System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(字符串路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,IsolatedStorageFile isf)      在System.IO.IsolatedStorage.IsolatedStorageFile.OpenFile(字符串路径,FileMode模式)   ...

要记住的一些事项:

1)每当应用程序启动时,删除操作首先在App.xaml.cs中运行,而锁定屏幕图像稍后由视图模型更新(这是针对天气应用程序,所以新的在返回天气后创建锁定屏幕图像。)

2)删除操作仅在主动打开应用程序且锁定屏幕设置开启时运行;在后台任务中根本没有调用它。

奇怪的是,当我全新安装应用程序时,默认情况下锁定屏幕设置已关闭。当我打开锁定屏幕时,锁屏图像会成功创建。如果我关闭应用程序并且从不重新启动它(从而从不调用删除操作代码),锁定屏幕图像永远不会更新,因为后台任务会遇到相同的先前引用的异常。

如果我遵循相同的步骤,但App.xaml.cs中没有删除操作代码,则锁屏图像每次都会成功更新。

3)在启动应用程序或后台任务(与锁定屏幕共享)时,实时磁贴继续更新而不会出现任何问题。

任何想法在这里发生了什么,以及我可以做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:0)

是否可以提供代码片段,以便从隔离存储中获取图像并将其更新为锁定屏幕

当两个线程试图访问同一个独立存储时,通常会抛出此异常。仅当它未附加到调试器(在您的情况下)时才会发生这种情况。找到它很棘手。我认为在删除图像的同时,图像也会被保存。

答案 1 :(得分:0)

documentation建议只在两个文件名之间交替使用:

string fileName;
var currentImage = LockScreen.GetImageUri();

if (currentImage.ToString().EndsWith("_A.jpg"))
{
    fileName = "LiveLockBackground_B.jpg";
}
else
{
    fileName = "LiveLockBackground_A.jpg";
}
var lockImage = string.Format("{0}", fileName);

我在我的某个应用中使用此方法没有问题。

如果您希望继续使用随机Guid,则在尝试删除之前,应检查文件名是否与当前锁屏不同。

var currentImage = LockScreen.GetImageUri();
using (var iso = IsolatedStorageFile.GetUserStoreForApplication() )
{
    foreach (string file in GetAllFiles("*.jpg", iso))
    {
        if(AreFilesTheSame(currentImage, file) == false)
        {
            iso.DeleteFile(file);
        }
    }
}