0

Windows ストア用のアプリがあり、ファイルからテキストを読み取ろうとしています。私は2つのテキストフィールドを持っています。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 個購入する

1kgの肉を買う;

インデックスの範囲外エラーが発生します。ReadFile() コードを修正する方法がわかりません。

メソッドを呼び出しているときに例外が表示されます。私が信じている問題は、新しい行を受け入れることができる descriptionTextBox にあります。

NotesData.txt

りんご;りんごの説明; // 正常に動作します

洋ナシ; 説明行 1

説明行 2

説明行 3; // 問題

洋ナシ; 説明行 1; // 正常に動作します

4

2 に答える 2

1

この行:

notesRepository.Add(new Note(line.Split(';')[0], line.Split(';')[1]));

は、行に少なくとも 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.
}
于 2012-12-29T09:14:23.273 に答える
1

以前に保存したファイルの内容を読み戻そうとしているように思えますが、問題は、最初にデータを保存するために選択した形式の結果にすぎません。それを見ると、新しい行だけが問題になるわけではありません。ユーザーがテキスト ボックスの 1 つにセミコロンを入力するとどうなりますか? それを防いでいるのですか?

独自のシリアル化形式を放棄し、既存のもののいずれかを使用することをお勧めします。の場合notesRespositoryList<Note>これは XML の (逆) シリアル化コードである可能性があります。

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のような構造化ストレージを検討することもできます。

于 2012-12-30T07:48:22.773 に答える