我有一个适用于Windows应用商店的应用,我想要做的是从文件中读取文本。我有两个textFields。 descriptionTextField接受新行。
// Read from file
public async Task ReadFile()
{
try
{
// get the file
StorageFile notesStorageFile = await localFolder.GetFileAsync("NotesData.txt");
var readThis = await FileIO.ReadLinesAsync(notesStorageFile);
foreach (var line in readThis)
{
notesRepository.Add(new Note(line.Split(';')[0], line.Split(';')[1]));
}
Debug.WriteLine("File read successfully.");
}
catch (FileNotFoundException ex)
{
Debug.WriteLine("Error1: " + ex);
}
}
现在,如果 NotesData.txt 具有:
鸡蛋;描述鸡蛋;
它的工作原理。
但是如果 NotesData.txt 有:
杂货;买10个鸡蛋
购买1公斤肉;
我得到索引超出范围的错误。我只是想弄清楚如何修复ReadFile()代码。
当我调用方法时出现异常。我认为问题在于可以接受新行的descriptionTextBox。
NotesData.txt
苹果;描述苹果; //工作正常
梨;说明第1行
描述第2行
描述第3行; //问题
梨;描述第1行; //工作正常
答案 0 :(得分:1)
这一行:
notesRepository.Add(new Note(line.Split(';')[0], line.Split(';')[1]));
假设您在一行中始终至少有一个分号。如果您的文件中有不的行(例如空白行),那么它就会失败。
目前还不清楚问题出在哪里,因为你还没有说出例外的来源,但那是我的第一次猜测。
我也只做过一次分裂:
string[] bits = line.Split(';');
if (bits.Length >= 2)
{
// What do you want to do with lines with more than one semi-colon?
notesRepository.Add(bits[0], bits[1]);
}
else
{
// Handle lines without a semi-colon at all.
}
答案 1 :(得分:1)
在我看来,您正在尝试回读之前保存的文件的内容,而您遇到的问题只是您首先选择保存数据的格式的结果。看着它,新的线条不是你将要遇到的唯一困难。如果用户决定在其中一个文本框中输入分号,该怎么办?你在阻止吗?
我建议您放弃自己的序列化格式,而是使用现有的格式之一。如果您的notesRespository
是List<Note>
,那么这可能是您的(de)序列化代码:
private async Task Save(List<Note> notesRepository)
{
var xmlSerializer = new XmlSerializer(typeof (List<Note>));
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync("notes.xml", CreationCollisionOption.ReplaceExisting))
{
xmlSerializer.Serialize(stream, notesRepository);
}
}
private async Task<List<Note>> Load()
{
var xmlSerializer = new XmlSerializer(typeof(List<Note>));
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync("notes.xml"))
{
return (List<Note>) xmlSerializer.Deserialize(stream);
}
}
这适用于JSON:
private async Task Save(List<Note> notesRepository)
{
var jsonSerializer = new DataContractJsonSerializer(typeof (List<Note>));
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync("notes.json", CreationCollisionOption.ReplaceExisting))
{
jsonSerializer.WriteObject(stream, notesRepository);
}
}
private async Task<List<Note>> Load()
{
var jsonSerializer = new DataContractJsonSerializer(typeof(List<Note>));
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync("notes.json"))
{
return (List<Note>)jsonSerializer.ReadObject(stream);
}
}
当存储库太大而无法始终加载并将其保存为整体时,您甚至可以考虑使用SQLite这样的结构化存储。