У меня есть следующий метод, который сохраняет файл в моем LocalFolder на Windows PhoneGetFileAsync не возвращает файл после сохранения его
public async Task<bool> SaveValueByKey(string filename, KeyValuePair<string, string> dataToSave)
{
var appData = ApplicationData.Current;
// Good Save documentation - http://chriskoenig.net/2012/09/07/windows-8-games-and-roaming-data/
StorageFile file = await appData.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
try
{
// Delete the key if it already exists, then replace.
IEnumerable<string> content = await this.LoadFileContents(filename);
if (content.Any(l => l.StartsWith(string.Format("{0}==", dataToSave.Key))))
{
await this.DeleteKey(filename, dataToSave.Key);
}
await FileIO.WriteTextAsync(file, string.Format("{0}=={1}", dataToSave.Key, dataToSave.Value));
}
catch (Exception)
{
return false;
}
return true;
}
Я потом пытаюсь загрузить данные обратно, используя этот метод.
public async Task<string> LoadValueFromKey(string filename, string key)
{
var appData = ApplicationData.Current;
StorageFile file = null;
try
{
file = await appData.LocalFolder.GetFileAsync(filename);
}
catch (FileNotFoundException)
{
return string.Empty;
}
catch (Exception)
{
return string.Empty;
}
IEnumerable<string> contents = await this.LoadFileContents(filename);
string element = string.Format("{0}==", key);
if (!contents.Any(line => line.StartsWith(element)))
{
return string.Empty;
}
return contents.First(line => line.StartsWith(element))
.ToString()
.Substring(element.Length);
}
Вызов к GetFileAsync
возвращает нулевое значение, даже если действительный объект файл был возвращен мне после CreateFileAsync
вызова.
Я что-то упустил? Существуют ли декларации, которые мне нужно сделать? Я не видел никаких связанных с этим.
Редактировать
имя файла и ключевые значения передаются в из репозитария, который декларирует их, как это:
private const string tokenFilename = "UserSession.dat";
private const string tokenKey = "UserToken";
Edit 2
Исключение бросают это Исключение FileNotFound со следующим сообщением.
The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Lifestream.App.Mobile.WindowsApp.Services.FileStorageService.<LoadValueFromKey>d__16.MoveNext()
Редактировать 3
Если я запустить приложение как приложение Windows (это универсальное приложение), файл сохраняется и загружается без каких-либо проблем. Если я нацелен на Windows Phone, то при попытке сохранить, а затем загрузится исключение «Файл не найден». Это похоже на телефон, и я не могу понять, почему
Эти запахи 'catch (Exception)' действительно пахнут. Попробуйте проверить их, чтобы увидеть, что это бросает или что-то в этом роде, и в любом случае исправить их гораздо меньше общего и потери данных-y. –
Исключением является исключение FileNotFound –
Проблема заключается в том, что Microsoft не сообщает мне, какие исключения могут использовать эти методы, поэтому я просто угадал. Я использую Exception на данный момент и по мере того, как исключения выполняются во время модульного тестирования, я добавляю уловы для более конкретных исключений. –