File.WriteAllLines dodaje spacje

0

Czesć. Robię baze danych na plikach i mam problem z niepoprawnym usuwaniem elementów z pliku. Mianowicie:

public class produkt
        {
public void usunProd(string nazwaProd)
            {
                string[] lines = File.ReadAllLines(sciezka, Encoding.GetEncoding("Windows-1250")); //Pobiera wszystkie wiersze pliku.txt
                string[] produkt = new string[8]; //Tworzy tablica do splitu;
                int pomId = lines.Length - 1; //Index pomocniczy do tablicy wyjsciowej
                string[] wynik = new string[pomId]; //tablica wyjsciowa do ponownego zapisu
                int wynikId = 0;//indeks pomocniczny do ponownego zapisu
               
                for (int y=0;y<lines.Length;y++) //petla na wierszach pliku
                {
                    produkt = lines[y].Split(';');
                    if (produkt[0]!=nazwaProd) //czy po splicie nazwa jest różna od parametru usunProd
                    {
                        wynik[wynikId] = lines[y]; //jezeli nie -> dodaj element do tablicy wyjsciowej
                        wynikId++;
                    }
                }
                File.WriteAllLines(sciezka, wynik); //zapis
             
                MessageBox.Show("Usunięto trwale z bazy produkt o nazwie: " + nazwaProd);
            }
}

Problem polega na tym, że skrypt działa niepoprawnie. Usuwa nie to co trzeba i dodaje dodatkowe puste wiersze

Wywołuje tą metode w ten sposób:

 
private void button10_Click(object sender, EventArgs e)
        {
            produkt removeProd = new produkt();
            ListView.SelectedListViewItemCollection zaznaczone = this.listView3.SelectedItems;
            foreach (ListViewItem item in zaznaczone)
            {
                listView3.Items.Remove(item);
                removeProd.usunProd(item.SubItems[0].Text);
            }
        }

Z góry dziękuje za sugestie.

1

Podaj przykładowe dane. Bez tego to wróżenie z fusów.

EDIT
Ogólnie to cały ten kod bym uprościł:

public void usunProd(string nazwaProd)
            {
                string[] lines = File.ReadAllLines(sciezka, Encoding.GetEncoding("Windows-1250")); //Pobiera wszystkie wiersze pliku.txt
                var wynik = lines.Where(line => line.Split(';')[0] != nazwaProd);
                File.WriteAllLines(sciezka, wynik); //zapis
 
                MessageBox.Show("Usunięto trwale z bazy produkt o nazwie: " + nazwaProd);
            }
}
0
Sarrus napisał(a):

Podaj przykładowe dane. Bez tego to wróżenie z fusów.

EDIT
Ogólnie to cały ten kod bym uprościł:


Super dzięki. Nie znałem takich możliwości dotychczas.

Ostatecznie sam rozwiązałem problem. Gdyby ktoś kiedyś potrzebował wrzucam.

public void usunProd(string nazwaProd)
            {
                string[] lines = File.ReadAllLines(sciezka, Encoding.GetEncoding("Windows-1250")); //Pobiera wszystkie wiersze pliku.txt
                var wynik = lines.Where(line => line.Split(';')[0] != nazwaProd);

                File.Delete(sciezka);
                File.AppendAllLines(sciezka, wynik);

                MessageBox.Show("Usunięto trwale z bazy produkt o nazwie: " + nazwaProd);
}
2

Dużo łatwiej byłoby Ci to zrealizować, gdybyś programował obiektowo. Klasa 'Produkt' powinna mieć właściwości opisujące parametry produktu, inna klasa powinna umożliwiać operowanie na kolekcji produktów, inna zaś mapować tę kolekcje na plik. No, i w kodzie operującym na plikach nie powinieneś odwoływać się do GUI.

0
somekind napisał(a):

Dużo łatwiej byłoby Ci to zrealizować, gdybyś programował obiektowo. Klasa 'Produkt' powinna mieć właściwości opisujące parametry produktu, inna klasa powinna umożliwiać operowanie na kolekcji produktów, inna zaś mapować tę kolekcje na plik. No, i w kodzie operującym na plikach nie powinieneś odwoływać się do GUI.

Tak jak najbardziej - stworzyłem odpowiednie klasy. Nie rozumiem tylko gdzie mam tu odwołanie do GUI?

2

Odwołanie do GUI masz tutaj:

 MessageBox.Show("Usunięto trwale z bazy produkt o nazwie: " + nazwaProd);

A jakbyś miał utworzone odpowiednie klasy, to ta linijka: var wynik = lines.Where(line => line.Split(';')[0] != nazwaProd) wyglądałaby tak: var wynik = products.Where(p => p.Nazwa != nazwaProd).

1 użytkowników online, w tym zalogowanych: 0, gości: 1