Windows Phone 8.1: не совсем понятно, где находится файл и как записывать данные

Я пытаюсь читать и записывать данные с помощью файла JSON. Я создал какой-то класс.

public class SimpleTask{...}
public class DayTask{...}
public class DataModel
{
    ...
    private async Task GetSimpleTaskAsync()
    {
        if (_daytask.Count != 0)
            return;
        string fileName = "a.json";
        Uri appUri = new Uri("ms-appx:///"+ fileName);
        StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(appUri);
        string jsonText = await FileIO.ReadTextAsync(file);
        JsonObject jsonObject = JsonObject.Parse(jsonText);
        JsonArray jsonArray = jsonObject["DayTasks"].GetArray();
        foreach (JsonValue daytaskValue in jsonArray)
        {
            JsonObject daytaskObject = daytaskValue.GetObject();
            ObservableCollection<SimpleTask> simpletask = new ObservableCollection<SimpleTask>();
            foreach (JsonValue simpletaskValue in daytaskObject["Tasks"].GetArray())
            {
                JsonObject simpletaskObject = simpletaskValue.GetObject();
                simpletask.Add(new SimpleTask(   simpletaskObject["StartTime"].GetString(),
                                                 simpletaskObject["EndTime"].GetString(), 
                                                 simpletaskObject["Description"].GetString()));
            }
            DayTask daytask = new DayTask(daytaskObject["Day"].GetString(),simpletask);

            this.DayTasks.Add(daytask);
        }
    }


}

Как видите, у меня есть метод, который получает данные из файла.json. Я создал файл.json:

В MainPage.xaml.cs есть метод, который вызывает GetDayTaskAysnc() метод и извлекает данные:

private async void ReadData1(object sender, TappedRoutedEventArgs e)
    {
        string test = String.Empty;
        var daytask = await DataModel.GetDayTaskAsync();
        foreach (var tasks in daytask)
        {
            test += String.Format("Day:{0}:\n", tasks.Day);
            foreach (var simpletask in tasks.Tasks)
            {
                test += String.Format("\tStart Time: {0}\n", simpletask.StartTime);
                test += String.Format("\tEnd Time: {0}\n", simpletask.EndTime);
                test += String.Format("\tDescription Time: {0}\n", simpletask.Description);
            }
        }
        TextBlock.Text = test;
}

Работало нормально! Но я хочу записать данные в тот же файл, поэтому я добавил данные жестко:

private List<DayTask> creatList()
    {
        List<DayTask> DayTasks = new List<DayTask>();
        ObservableCollection<SimpleTask> simpletask1 = new ObservableCollection<SimpleTask>();
        simpletask1.Add(new SimpleTask("6AM","7AM","Breakfast"));
        simpletask1.Add(new SimpleTask("8AM", "9AM", "Game"));
        ObservableCollection<SimpleTask> simpletask2 = new ObservableCollection<SimpleTask>();
        simpletask2.Add(new SimpleTask("6AM", "7AM", "Sleep"));
        simpletask2.Add(new SimpleTask("8AM", "9AM", "School"));
        DayTasks.Add(new DayTask ("3/8/2014",simpletask1));
        DayTasks.Add(new DayTask("4/8/2014", simpletask2));
        return DayTasks;
    }
    private async void WriteData(object sender, TappedRoutedEventArgs e)
    {
        string json = "a.json";
        List<DayTask> daytasks = creatList();
        var serializer = new DataContractJsonSerializer(typeof(List<DayTask>));
        var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(json, CreationCollisionOption.ReplaceExisting);
        using (stream)
        {
            serializer.WriteObject(stream, daytasks);
        }

        TextBlock.Text = "Write to Json file succeeded";
    }

Когда я запустил свое приложение с эмулятором оконного телефона, во-первых, оно записало в файл. Затем я нажал кнопку "Чтение данных", чтобы убедиться, что данные записаны правильно, эмулятор отображал данные из файла.json без изменения WriteData() метод. Я продолжил создавать второй метод чтения данных:

private async void ReadData2(object sender, TappedRoutedEventArgs e)
    {
        string test = String.Empty;
        string json = "a.json";
        string content = String.Empty;
        List<DayTask> mytasks = new List<DayTask>();
        var deserializer = new DataContractJsonSerializer(typeof(List<DayTask>));
        var stream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(json);
        using (stream)
        {
            mytasks = (List<DayTask>)deserializer.ReadObject(stream);
        }
        foreach (var tasks in mytasks)
        {
            test += String.Format("Day:{0}:\n", tasks.Day);
            foreach (var simpletask in tasks.Tasks)
            {
                test += String.Format("\tStart Time: {0}\n", simpletask.StartTime);
                test += String.Format("\tEnd Time: {0}\n", simpletask.EndTime);
                test += String.Format("\tDescription Time: {0}\n", simpletask.Description);
            }
        }
        TextBlock.Text = test;
    }

Я развернул свое приложение несколько раз, и вот мой результат:

  1. ReadData2 (): 'System.IO.FileNotFoundException'
  2. WriteData() -> ReadData1(): были показаны данные из a.json
  3. WriteData () -> ReadData2(): данные из creatList() был показан
  4. WriteData() -> ReadData1(): данные из a.json были показаны -> ReadData2(): данные из creatList() был показан

Итак, у меня есть вопрос:

  1. Есть ли у меня 2 json-файла, один из которых я создал, добавив в свой проект, а другой - при запуске WriteData() метод? Каковы их пути?
  2. Если мой файл data.json в DataSource папку, как я могу записать данные в нее? Я могу читать данные из него, используя URI, как GetSimpleTaskAsync() но я не знаю, как правильно написать. (Я пытался преобразовать объект в строку для записи, но не могу прочитать его снова, думаю, я написал это неправильно)

Извините за мой длинный пост и мой плохой английский:) Спасибо большое

1 ответ

Решение

Но я хочу записать данные в тот же файл, поэтому я добавил данные жестко:

Вы путаете между папками ms-appx:/// и ms-appdata:/// (или ApplicationData.Current.LocalFolder)

Папка ms-appx доступна только для чтения. Вы не можете написать ему. (или вы можете редактировать код своего приложения без прохождения процесса сертификации)

Файл, который вы написали, должен находиться в папке ms-appdata.

Другие вопросы по тегам