Visual studio 2013 不允许对IsolatedStorageFileStream执行操作。使用MvvmCross文件插件时

Visual studio 2013 不允许对IsolatedStorageFileStream执行操作。使用MvvmCross文件插件时,visual-studio-2013,windows-phone-8.1,mvvmcross,Visual Studio 2013,Windows Phone 8.1,Mvvmcross,我的服务中注入了一个针对Windows Phone的IMvxFileStore实现实例 假设我想将设置存储在位于appsettings\userprofiles\profile1.txt的文件中 使用文件插件,我首先调用APIEncureFolderexists,将完整路径传递到我的配置文件设置文件appsettings\userprofiles\profile1.txt,以确保此文件夹已创建且确实存在 为了保持清醒,我检查以确保文件夹是使用FolderExistAPI创建的。至少现在,这总是返

我的服务中注入了一个针对Windows Phone的IMvxFileStore实现实例

假设我想将设置存储在位于appsettings\userprofiles\profile1.txt的文件中

使用文件插件,我首先调用APIEncureFolderexists,将完整路径传递到我的配置文件设置文件appsettings\userprofiles\profile1.txt,以确保此文件夹已创建且确实存在

为了保持清醒,我检查以确保文件夹是使用FolderExistAPI创建的。至少现在,这总是返回真值

代码如下所示:

  private string GetStorageItemFileName(string filename)
        {
            Guard.ThrowIfNull(string.IsNullOrWhiteSpace(BaseDirectory), Messages.RepositorBackingStoreIsNull);
            filename = _fileStore.PathCombine(BaseDirectory, filename); 

            _fileStore.EnsureFolderExists(filename);    
            if (_fileStore.FolderExists(filename))
            {
                // what do do????
            }

            return filename;
        }
private string GetStorageItemFileName(string filename)
        {
            Guard.ThrowIfNull(string.IsNullOrWhiteSpace(BaseDirectory), Messages.RepositorBackingStoreIsNull);
            filename = _fileStore.PathCombine(BaseDirectory, filename); 

           // assumption is that filename does not contain directory information
            _fileStore.EnsureFolderExists(BaseDirectory);    

            return filename;
        }
但是,当我尝试使用WriteToFileAPI将内容写入文件时,会传入从上述方法返回的文件名和一些字符串,如下所示

 try
            {
                _fileStore.WriteFile(filename, content);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }    
,我得到以下异常:

System.IO.IsolatedStorage.IsolatedStorage异常被捕获
HResult=-2146233264消息=不允许在上执行操作 隔离存储文件流。Source=mscorlib StackTrace: 在System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(字符串路径, FileMode模式、FileAccess访问、FileShare共享、Int32 bufferSize、, 隔离存储文件(isf) 在System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(字符串路径, 文件模式,隔离存储文件(isf) 在cirries.MvvmCross.Plugins.File.WindowsPhone.MvxIsolatedStorageFileStore.WriteFileCommon(字符串 路径,操作'1(流操作) 在cirries.MvvmCross.Plugins.File.WindowsPhone.MvxIsolatedStorageFileStore.WriteFile(字符串 路径、字符串内容) 位于TrackuTransit.Core.Services.DataStore.StorageItemFileRepository.Put(字符串 文件名,存储项数据)内部异常:

我的开发环境设置如下: -Surface Pro 3 -Visual Studio 2013社区 -Windows Phone 8.1 SDK和模拟器 -MvvmCross 3.0.0.4。(是的,它是旧的,将在MVP后更新)


在我深入研究MvvmCross代码库之前,任何人都知道我可能在这里做错了什么?

将项目升级到.NET 4.5,也升级到MvvmCross 3.5.1,但仍然遇到同样的问题。虽然由于升级,我损失了几天时间,但我很高兴升级结束了

我在这里遇到的问题与我打电话有关

 _fileStore.EnsureFolderExists(filename);  
并传入文件的完整路径。在场景下面,MvvmCross正在呼叫

IsolatedStorageFile.CreateDirectory(filename);
它似乎正在创建具有相同文件名的目录。因此,将“images\image1.png”传递到上述API似乎是为了创建一个目录或保存一些与“images\images.png”相关的IO资源

当您尝试使用写入文件时

_fileStore.WriteFile(filename, content);
MvvmCross正在尝试使用创建文件流

var fileStream = new IsolatedStorageFileStream(path, FileMode.Create, isf))
异常就在这里抛出

修复方法是确保您正在传递给IMvxFileStore.EnsureFolderExists API的只是有问题的文件夹。在这种情况下,它是“图像”。然后将文件的相对路径(包括文件名,如“images\image1.png”)传递给IMvxFileStore.WriteFile,就可以开始了

固定代码如下所示:

  private string GetStorageItemFileName(string filename)
        {
            Guard.ThrowIfNull(string.IsNullOrWhiteSpace(BaseDirectory), Messages.RepositorBackingStoreIsNull);
            filename = _fileStore.PathCombine(BaseDirectory, filename); 

            _fileStore.EnsureFolderExists(filename);    
            if (_fileStore.FolderExists(filename))
            {
                // what do do????
            }

            return filename;
        }
private string GetStorageItemFileName(string filename)
        {
            Guard.ThrowIfNull(string.IsNullOrWhiteSpace(BaseDirectory), Messages.RepositorBackingStoreIsNull);
            filename = _fileStore.PathCombine(BaseDirectory, filename); 

           // assumption is that filename does not contain directory information
            _fileStore.EnsureFolderExists(BaseDirectory);    

            return filename;
        }

在这一点上很难说,因为你是在这样一个旧版本。我会努力使项目最新和最伟大的,因为它可能已经被照顾。这将使您感到痛苦,因为您需要将PCL配置文件更改为259或其他兼容的配置文件。此外,请确保您没有多个线程同时访问隔离存储。如果您这样做,您需要将打开文件调用的最后一个参数设置为System.IO.FileShare.ReadWrite或您需要的任何权限。这是我不希望听到的答案:),因为此时升级解决方案(包括28个项目)将使我至少倒退几天。我怀疑这是一个跨线程问题。