2014-12-24 2 views
0

У меня есть следующий метод, который сохраняет файл в моем 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, то при попытке сохранить, а затем загрузится исключение «Файл не найден». Это похоже на телефон, и я не могу понять, почему

+0

Эти запахи 'catch (Exception)' действительно пахнут. Попробуйте проверить их, чтобы увидеть, что это бросает или что-то в этом роде, и в любом случае исправить их гораздо меньше общего и потери данных-y. –

+0

Исключением является исключение FileNotFound –

+0

Проблема заключается в том, что Microsoft не сообщает мне, какие исключения могут использовать эти методы, поэтому я просто угадал. Я использую Exception на данный момент и по мере того, как исключения выполняются во время модульного тестирования, я добавляю уловы для более конкретных исключений. –

ответ

0

Я смог решить это. Проблема заключалась в свойствах проекта Windows Phone. Свойства-> В Debug была отмечена опция «Удалить, а затем переустановить мой пакет», которая удаляла все сохраненные файлы, которые я создавал, каждый раз, когда я перезапускал приложение.

Смежные вопросы