Чтение определенной строки текстового файла в WP7 на основе некоторой начальной строки и ее замена (перезапись) - PullRequest
1 голос
/ 16 ноября 2011

Я могу выполнить операцию чтения / записи / добавления при хранении текстового файла в изолированном хранилище в приложении WP7.

Мой сценарий заключается в том, что я храню разделенные пробелом значения в текстовом файле в изолированном хранилище.

Итак, если мне нужно найти для какой-то конкретной строки, имеющей некоторый стартовый ключ, как перезаписать значение для этого ключа, не затрагивая другую строку до и после нее.

Пример:

  1. Значение ключа SomeOtherValue
  2. * статус прочитан хорошо
  3. статус1 непрочитан плохо
  4. status2 null cantsay *

Так что, если мне нужно изменить всю вторую строку, основываясь на каком-то условии с ключом, таким же, как

status1 read read

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Существует несколько способов сделать это, и выбранный вами метод должен наилучшим образом соответствовать размеру и сложности файла данных.

Один из вариантов, с которого можно начать, - использовать статический string.Replace () метод.Это грубо, но если ваш файл только маленький, то в этом нет ничего плохого.

class Program
{
    static void Main(string[] args)
    {

        StringBuilder sb = new StringBuilder();
        sb.AppendLine("*status read good");
        sb.AppendLine("status1 unread bad");
        sb.AppendLine("status2 null cantsay*");

        string input = sb.ToString();

        var startPos = input.IndexOf("status1");
        var endPos = input.IndexOf(Environment.NewLine, startPos);
        var modifiedInput = input.Replace(oneLine.Substring(startPos, endPos - startPos), "status1 read good");


        Console.WriteLine(modifiedInput);

        Console.ReadKey();
    }
}
0 голосов
/ 17 ноября 2011

Если вы сохраните эту информацию в текстовых файлах, то не будет никакого способа заменить целые файлы. Следующий код делает именно это и может даже быть тем, что вы делаете прямо сейчас.

// replace a given line in a given text file with a given replacement line
private void ReplaceLine(string fileName, int lineNrToBeReplaced, string newLine)
{
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
    {
        // the memory writer will hold the read and modified lines
        using (StreamWriter memWriter = new StreamWriter(new MemoryStream()))
        {
            // this is for reading lines from the source file
            using (StreamReader fileReader = new StreamReader(new IsolatedStorageFileStream(fileName, System.IO.FileMode.Open, isf)))
            {
                int lineCount = 0;
                // iterate file and read lines
                while (!fileReader.EndOfStream)
                {
                    string line = fileReader.ReadLine();

                    // check if this is the line which should be replaced; check is done by line 
                    // number but could also be based on content
                    if (lineCount++ != lineNrToBeReplaced)
                    {
                        // just copy line from file
                        memWriter.WriteLine(line);
                    }
                    else
                    {
                        // replace line from file
                        memWriter.WriteLine(newLine);
                    }
                }
            }

            memWriter.Flush();
            memWriter.BaseStream.Position = 0;

            // re-create file and save all lines from memory to this file
            using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(fileName, System.IO.FileMode.Create, isf))
            {
                memWriter.BaseStream.CopyTo(fileStream);
            }
        }
    }
}


private void button1_Click(object sender, RoutedEventArgs e)
{
    ReplaceLine("test.txt", 1, "status1 read good");
}

И я согласен с Slugster: использование базы данных SQLCE может быть решением с лучшей производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...