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;
}
Я развернул свое приложение несколько раз, и вот мой результат:
- ReadData2 (): 'System.IO.FileNotFoundException'
- WriteData() -> ReadData1(): были показаны данные из a.json
- WriteData () -> ReadData2(): данные из
creatList()
был показан - WriteData() -> ReadData1(): данные из a.json были показаны -> ReadData2(): данные из
creatList()
был показан
Итак, у меня есть вопрос:
- Есть ли у меня 2 json-файла, один из которых я создал, добавив в свой проект, а другой - при запуске
WriteData()
метод? Каковы их пути? - Если мой файл
data.json
вDataSource
папку, как я могу записать данные в нее? Я могу читать данные из него, используя URI, какGetSimpleTaskAsync()
но я не знаю, как правильно написать. (Я пытался преобразовать объект в строку для записи, но не могу прочитать его снова, думаю, я написал это неправильно)
Извините за мой длинный пост и мой плохой английский:) Спасибо большое
1 ответ
Но я хочу записать данные в тот же файл, поэтому я добавил данные жестко:
Вы путаете между папками ms-appx:/// и ms-appdata:/// (или ApplicationData.Current.LocalFolder)
Папка ms-appx доступна только для чтения. Вы не можете написать ему. (или вы можете редактировать код своего приложения без прохождения процесса сертификации)
Файл, который вы написали, должен находиться в папке ms-appdata.