Запись в конкретную строку в текстовом файле C # - PullRequest
0 голосов
/ 01 июля 2010

У меня есть веб-приложение, которое я разрабатываю на работе. Мне нужно иметь возможность взять входные данные и добавить текстовый файл после (х) числа строк.

Мое веб-приложение использует asp.net с c #

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 01 июля 2010

Нет способа "вставить" в файл вообще - или перейти к определенной строке, не читая все остальные, если они не имеют фиксированный размер (в байтах).

Обычно подход будет выглядеть примерно так:

  • Начните писать новый файл
  • Открыть существующий файл
  • Скопировать первые x строк из старого файла в новый
  • Написать новую строку
  • Скопируйте оставшиеся строки из старого файла в новый
  • Переместить старый в файл резервной копии
  • Переместить новый файл на старое имя
  • Удалить файл резервной копии

(Это гарантирует, что в любой точке есть как минимум старого файла в некоторой форме. Вы можете сделать его немного проще, если просто удалите старый файл, а затем переместите новый на место.)

Не забудьте убедиться, что это синхронизировано должным образом - вы не хотите, чтобы две копии этого алгоритма работали одновременно ...

РЕДАКТИРОВАТЬ: если у вас есть XML-файлы, то я бы предложил просто загрузить их в DOM (например, с помощью LINQ to XML), внести изменения, а затем сохранить их снова. Не рассматривайте это как неструктурированный текстовый файл.

Вы могли бы потенциально сделать это более эффективным, используя XmlReader и XmlWriter - но вам, безусловно, придется прочитать весь исходный файл и записать новый файл. Вы тестировали простой код и нашли его слишком медленным? Как часто ты это делаешь? Насколько большие файлы?

0 голосов
/ 01 июля 2010

ОК - Благодаря вашей помощи Джон, я понял это.


            FileInfo fi = new FileInfo(Server.MapPath("~/Playlists/" + user + "/" + ListBox1.SelectedItem.Text  + ".wpl"));
            XmlDocument originalXML = new XmlDocument();
            originalXML.Load(fi.FullName);
            XmlWriter newXML = XmlWriter.Create(Server.MapPath("~/Playlists/" + user + "/" + ListBox1.SelectedItem.Text + ".wpl"));
            XmlNode smil = originalXML.SelectSingleNode("smil/body/seq");
            XmlNode media = originalXML.CreateNode(XmlNodeType.Element, "media", null);
            XmlAttribute src = originalXML.CreateAttribute("src");
            DirectoryInfo di = new DirectoryInfo(Server.MapPath("~" + folder));


            foreach (FileInfo file in di.GetFiles("*", SearchOption.AllDirectories))
            {
                string path = file.FullName;
                path = path.Replace(@"F:\Music\Music by Artist", "http://bgab-mor01-n/Music");
                path = path.Replace(@"\", "/");
                path = path.Replace(",", "");
                path = path.Replace("'", "");
                path = path.Replace("&", "");
                if (file.Extension == ".mp3" || file.Extension == ".wma" || file.Extension == ".MP3")
                {
                    src.Value = path;
                    media.Attributes.Append(src);
                    smil.AppendChild(media);

                }

            }

            originalXML.Save(newXML);
            newXML.Close();

Я действительно не смог бы сделать это без вас.Ты человек.Спасибо за все.

0 голосов
/ 01 июля 2010

Я бы предложил найти другую стратегию, в частности систему управления реляционными базами данных. Текстовый файл живет в файловой системе и не поддерживает параллельный доступ, как хорошая база данных (читай: не доступ). Веб-приложение поддерживает одновременные запросы. Если у вас одновременно работает несколько пользователей, ваше приложение будет испытывать исключения ввода-вывода.

...