Visual studio 2013 不允许对IsolatedStorageFileStream执行操作。使用MvvmCross文件插件时
我的服务中注入了一个针对Windows Phone的IMvxFileStore实现实例 假设我想将设置存储在位于appsettings\userprofiles\profile1.txt的文件中 使用文件插件,我首先调用APIEncureFolderexists,将完整路径传递到我的配置文件设置文件appsettings\userprofiles\profile1.txt,以确保此文件夹已创建且确实存在 为了保持清醒,我检查以确保文件夹是使用FolderExistAPI创建的。至少现在,这总是返回真值 代码如下所示: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创建的。至少现在,这总是返
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个项目)将使我至少倒退几天。我怀疑这是一个跨线程问题。