我为注入我服务的Windows Phone提供了一个IMvxFileStore实现实例。
假设我想将设置存储在位于appsettings \ userprofiles \ profile1.txt的文件中
使用文件插件,我首先调用API EnsureFolder ,将完整路径传递到我的配置文件设置文件appsettings \ userprofiles \ profile1.txt,以确保已创建此文件夹并执行此操作存在。
为了理智,我检查以确保使用 FolderExist API创建了该文件夹。到目前为止,这总是至少返回真实。
代码如下所示:
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;
}
但是,当我尝试使用 WriteToFile API将内容写入文件时,传入上面方法返回的文件名和一些字符串,如下所示
try
{
_fileStore.WriteFile(filename, content);
}
catch (Exception ex)
{
Logger.Error(ex);
}
,我得到以下异常:
发现了System.IO.IsolatedStorage.IsolatedStorageException HResult = -2146233264消息=不允许操作 IsolatedStorageFileStream。 Source = mscorlib StackTrace: 在System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize, IsolatedStorageFile isf) 在System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode模式,IsolatedStorageFile isf) 在Cirrious.MvvmCross.Plugins.File.WindowsPhone.MvxIsolatedStorageFileStore.WriteFileCommon(String path,Action`1 streamAction) 在Cirrious.MvvmCross.Plugins.File.WindowsPhone.MvxIsolatedStorageFileStore.WriteFile(String 路径,字符串内容) 在TrackuTransit.Core.Services.DataStore.StorageItemFileRepository.Put(String filename,StorageItem data)InnerException:
我的开发环境设置如下: - Surface Pro 3 - Visual Studio 2013社区 - Windows Phone 8.1 SDK和模拟器 - MvvmCross 3.0.0.4。 (是的,它已经过时了,将在MVP之后更新。)
在我深入研究MvvmCross代码库之前,有没有人知道我在这里做错了什么?
答案 0 :(得分:0)
将项目升级到.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。在这种情况下,它是“图像”。然后传递给IMvxFileStore.WriteFile文件的相对路径,包括文件名,例如“images \ image1.png”,你就可以了。
固定代码如下所示:
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;
}