如何从StorageFile读取直到在Windows应用商店应用中找到的字符?

时间:2012-12-29 09:01:11

标签: c# .net windows-runtime windows-store-apps

我有一个适用于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行; //工作正常

2 个答案:

答案 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)

在我看来,您正在尝试回读之前保存的文件的内容,而您遇到的问题只是您首先选择保存数据的格式的结果。看着它,新的线条不是你将要遇到的唯一困难。如果用户决定在其中一个文本框中输入分号,该怎么办?你在阻止吗?

我建议您放弃自己的序列化格式,而是使用现有的格式之一。如果您的notesRespositoryList<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这样的结构化存储。