我目前正在为Xamarin应用程序使用最新版本的PCLStorage,它在Android中无法正常运行。每次我的应用加载时,它都找不到我刚刚创建的目录。但这在我的Windows项目中工作正常。奇...
有谁知道与便携式类库兼容的好选择?
谢谢!
更新1
这是我使用的代码:
这些是保存/加载数据的功能:
public static async Task<bool> LoadPlayerData()
{
PlayerData data = await LoadData<PlayerData>("PlayerState.dat");
if (data != null)
{
PlayerData.Current = data;
return true;
}
else
return false;
}
public static async Task SavePlayerData()
{
IFolder dataFolder = await GetDataFolder(true);
IFile file = await dataFolder.CreateFileAsync("PlayerState.dat", CreationCollisionOption.ReplaceExisting);
string json = await Task.Factory.StartNew(() => JsonConvert.SerializeObject(PlayerData.Current, Formatting.Indented));
await file.WriteAllTextAsync(json);
}
这些是使用PCLStorage起作用的功能:
private static async Task<T> LoadData<T>(string filename)
{
IFolder dataFolder = await GetDataFolder(false);
if (dataFolder == null)
return default(T);
IFile file = null;
try
{
// Catch the exception if the file doesn't yet exist
file = await dataFolder.GetFileAsync(filename);
}
catch (PCLStorage.Exceptions.FileNotFoundException) { return default(T); }
catch (System.IO.FileNotFoundException) { return default(T); }
if (file == null)
return default(T);
string contents = await file.ReadAllTextAsync();
T data = JsonConvert.DeserializeObject<T>(contents);
return data;
}
private static async Task<IFolder> GetDataFolder(bool createIfNonExistent)
{
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder dataFolder = null;
// Save actions will create the folder if it doesn't exist. Load actions will only try to get the folder.
if (createIfNonExistent)
dataFolder = await rootFolder.CreateFolderAsync("GameData", CreationCollisionOption.OpenIfExists);
else
{
try
{
// Catch the exception if the folder doesn't yet exist
dataFolder = await rootFolder.GetFolderAsync("GameData");
}
catch (PCLStorage.Exceptions.DirectoryNotFoundException) { return null; }
}
return dataFolder;
}
在Windows 8项目中,一切运行正常,但是在Android中,当尝试加载刚刚创建的数据时(例如,重新启动应用程序时),我总是在GetDataFolder函数中得到DirectoryNotFoundException。
更新2
在SavePlayerData函数上,我成功创建了文件,因为它包含以下路径:
/data/data/com.quickshift/files/GameData/PlayerState.dat
重新启动应用程序时,使用以下消息调用rootFolder.GetFolderAsync(...)时,GetDataFolder函数将失败:
目录不存在:/data/data/com.quickshift/files/GameData
我会继续研究这个问题,它在几周前就可以使用了,但我从未更改过此代码...
最佳答案
我不确定为什么该文件夹将不存在。您能否查看设备/仿真器上的文件系统以查看数据文件在第一次运行后是否在那里?
如果该文件夹不存在,则您的GetDataFolder方法看起来应该返回null而不是让异常通过。听起来GetDataFolder方法没有捕获从GetFolderAsync()抛出的DirectoryNotFoundException。您可以尝试更改catch块来捕获IOException或Exception而不是PCLStorage的DirectoryNotFoundException,看看是否会改变行为吗?
是否从LoadData的第一行调用GetFolderAsync(false)引发异常?