Как да запазя съдържание от List‹string› в текстов файл в C#?

Имам списъчно поле, което показва имената на файловете, които са отворени или с функция за плъзгане, или с OpenFileDialog, пътищата на файловете се съхраняват в списъка с имена за изпълнение, а списъчното поле показва само имената без пътища и разширения. Когато формулярът ми се затвори, съдържанието на плейлиста се записва в .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();
        }

Това е кодът, използван за ПРОЧИТАНЕ на същия txt файл:

 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