Как сохранить содержимое из List‹string› в текстовый файл на C#?

У меня есть список, в котором отображаются имена файлов, которые открываются либо с помощью функции перетаскивания, либо с помощью OpenFileDialog, пути к файлам хранятся в списке воспроизведения с именем List, а в списке отображаются только имена без путей и расширений. Когда моя форма закрывается, содержимое списка воспроизведения сохраняется в файле .txt. Когда я снова открываю свое приложение, содержимое текстового файла снова сохраняется в списке и списке воспроизведения. Но когда я добавляю новые файлы после повторного открытия формы, я не знаю, почему она оставляет пустую строку между последними файлами и недавно добавленными.

Это код, который я использую для ЗАПИСИ содержимого списка воспроизведения (списка) в txt-файле:

 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        if(listBox1.Items.Count > 0)
        {
            StreamWriter str = new StreamWriter(Application.StartupPath + "/Text.txt");
            foreach (String s in playlist)
            {
                str.WriteLine(s);
            }
            str.Close();
        }

Это код, используемый для ПРОЧТЕНИЯ того же текстового файла:

 private void Form1_Load(object sender, EventArgs e) //Form Load!!!
    {
        FileInfo info = new FileInfo(Application.StartupPath + "/Text.txt");
        if(info.Exists)
        {
            if (info.Length > 0)
            {
                System.IO.StreamReader reader = new System.IO.StreamReader(Application.StartupPath + "/Text.txt"); //StreamREADER
                try
                {
                    do
                    {
                        string currentRead = reader.ReadLine();
                        playlist.Add(currentRead);
                        listBox1.Items.Add(System.IO.Path.GetFileNameWithoutExtension(currentRead));

                    } while (true);
                }
                catch (Exception)
                {
                    reader.Close();
                    listBox1.SelectedIndex = 0;
                }
            }
            else
            {
                File.Delete(Application.StartupPath + "/Text.txt");
            }
        }
        else
        {
            return;
        }

    }

Код, используемый для добавления файлов в список и плейлист:

OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Select File(s)";
        ofd.Filter = "Audio Files (*.mp3, *.wav, *.wma)|*.mp3|*.wav|*.wma";
        ofd.InitialDirectory = "C:/";
        ofd.RestoreDirectory = false;
        ofd.Multiselect = true;
        ofd.ShowDialog();

        foreach (string s in ofd.FileNames)
        {
            listBox1.Items.Add(Path.GetFileNameWithoutExtension(s));
            playlist.Add(s);
        }


        listBox1.SelectedIndex = 0;

Вот что я получаю, когда добавляю новые файлы после повторного открытия формы: !!!!

Заранее спасибо, надеюсь, сообщество StackOverflow сможет мне помочь!


person ChrisCreateBoss    schedule 27.01.2015    source источник


Ответы (1)


Прежде всего: отлаживайте свой код, и вы сами найдете проблему :)

Проблема заключается в использовании метода WriteLine. В последней написанной строке следует использовать метод Write, чтобы в конце не было пустой строки. В качестве альтернативы и более простой реализации можно добавить только непустые строки в ваш плейлист, например:

// ...
do
{
    string currentRead = reader.ReadLine();
    if (!string.IsNullOrWhiteSpace(currentRead)) // ignore empty lines
    {
        playlist.Add(currentRead);
       listBox1.Items.Add(System.IO.Path.GetFileNameWithoutExtension(currentRead));
    }
} while (true);

В качестве побочного комментария: while (true) и использование обработки исключений - плохой подход к завершению цикла.

person Quality Catalyst    schedule 28.01.2015
comment
Итак, я должен написать содержимое плейлиста с помощью: str.Write(s) Я прав? - person ChrisCreateBoss; 28.01.2015
comment
Не обязательно. В идеале вы избегаете написания пустых строк, и пока есть только одна, которая является последней строкой в ​​вашем файле. Поэтому, если вы просматриваете свой список воспроизведения построчно, убедитесь, что вы добавляете новую строку только в том случае, если это не последний элемент списка воспроизведения. Если вы используете Write(s) в целом, это не будет работать для нескольких элементов плейлиста. Просто попробуйте отладить, и вы увидите. На мой взгляд, вам лучше сделать безопасное чтение, что означает сделать что-то похожее на мой пример. Вы не должны доверять источнику в целом, даже если ваше приложение написало его. - person Quality Catalyst; 28.01.2015
comment
Я использовал метод безопасного чтения, и моя форма не открылась. Что может быть не так сейчас? - person ChrisCreateBoss; 28.01.2015
comment
Пожалуйста, ОТЛАДКА! Пример кода выше не влияет на обработку диалога. - person Quality Catalyst; 28.01.2015
comment
Моя форма больше не открывается в режиме отладки - person ChrisCreateBoss; 28.01.2015
comment
@ChrisCreateBoss: отладка помогает найти проблемы, и вы найдете ответ, почему ваша форма не открывается. Если нет: напишите новый вопрос ;-) Что касается вашей проблемы, указанной выше, пожалуйста, попробуйте, как только ваше приложение снова заработает так же, как когда вы задали свой вопрос. - person Quality Catalyst; 28.01.2015