• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# System.IO.IOException: Proces nie może uzyskać dostępu do pliku, ponieważ jest on używany przez inny proces.

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
4,297 wizyt
pytanie zadane 8 czerwca 2018 w C# przez budyb Nowicjusz (150 p.)

private void button2_Click(object sender, EventArgs e)
        {       bool istnieje = false;
            if(line_login.Text==""||line_login.Text==" "||line_haslo.Text==""||line_haslo.Text==" "||line_imie.Text==""||line_imie.Text==" "||line_nazwisko.Text==""||line_nazwisko.Text==" "||line_email.Text==""||line_email.Text==" ")
            {
                MessageBox.Show("Wszystkie pola muszą być wypełnione!", "Uwaga");
            }
            else if (konto.typ!="admin" && konto.typ!="office" && konto.typ!="staff" && konto.typ!="user")
            {
                MessageBox.Show("Podaj typ konta", "Uwaga");
            }
            else
            {
                string linia;
                string[] slowa;
                slowa = new string[6];
     ////////////////////////////uzycie pliku///////////////////////////////////
                FileStream sp = new FileStream(Path, FileMode.Open, FileAccess.Read); 
                StreamReader sprawdz = new StreamReader(sp);
                while(sprawdz.ReadLine()!=null)
                {
                    try
                    {
                        linia = sprawdz.ReadLine();
                        slowa = linia.Split(' ');
                    }
                    catch (NullReferenceException){}
                   if (line_login.Text == slowa[0])
                        {
                            MessageBox.Show("Podany login jest zajęty", "Uwaga");
                            istnieje = true;
                            break;
                        }
                        if (line_email.Text == slowa[5])
                        {
                            MessageBox.Show("Podany email jest zajęty", "Uwaga");
                            istnieje = true;
                            break;
                        }
                    
                 }
//////////////////////zamykanie pliku///////////////////////////////
                sprawdz.Close();
                sp.Close();
                sprawdz.Dispose();
                if (istnieje==false)
                {
                    konto.login = line_login.Text;
                    konto.haslo = line_haslo.Text;
                    konto.imie = line_imie.Text;
                    konto.nazwisko = line_nazwisko.Text;
                    konto.email = line_email.Text;
                    string dane = konto.login + " " + konto.haslo + " " + konto.typ + " " + konto.imie + " " + konto.nazwisko + " " + konto.email;
                    
                   
                    FileStream fs = new FileStream(Path,FileMode.Open, FileAccess.Write,FileShare.ReadWrite);   ////////////<-Tu występuje błąd////////////////
                    StreamWriter sw = new StreamWriter(fs);
                    sw.WriteLine(dane);
                    MessageBox.Show("Dodano konto");
                    this.Hide();
                }
            }
        }

Gdy próbuję dopisać linię do pliku txt występuje błąd taki jak w tytule. Dany plik jest używany w poprzednim oknie i zamykany w taki sam sposób jak tutaj. W tym oknie plik najpierw jest otwierany bez problemu, natomiast za drugim razem (gdy chcę dopisać do pliku) wyskakuje błąd. Menedżer zadań pokazuje dwa procesy z mojej aplikacji, jednak jedno okno wcale nie używa tego pliku, nie ma tam nic o nim wspomniane, dlatego nie wiem dlaczego jakiś proces miałby używać tego pliku. Dziękuję za wszelką pomoc.

4 odpowiedzi

+1 głos
odpowiedź 12 czerwca 2018 przez Siemił Mądrala (7,380 p.)

Nie wiem czy pomoże ale powinieneś używać usingów:

using(FileStream sp = new FileStream(Path, FileMode.Open, FileAccess.Read))
using(StreamReader sprawdz = new StreamReader(sp))
{

}

//W tym miejscu c# sam pozamyka i posprząta strumienie

 

+1 głos
odpowiedź 12 czerwca 2018 przez CjanciK Bywalec (2,970 p.)

Nie wiem czy pomoże ale powinieneś używać usingów:


using(FileStream sp = new FileStream(Path, FileMode.Open, FileAccess.Read))
using(StreamReader sprawdz = new StreamReader(sp))
{
 
}
 
//W tym miejscu c# sam pozamyka i posprząta strumienie

 

Dokładnie jak napisał kolega. Pliki otwierane przez Twoją aplikację są zasobami niezarządzanymi i te obiekty powinny być powołane do życia w bloku using, wtedy po wykonaniu wszystkich instrukcji z bloku obiekt zostanie usunięty z pamięci. Polecam poczytać o Garbage Collector i o zasobach niezarządzanych.

0 głosów
odpowiedź 8 czerwca 2018 przez RafalS VIP (122,820 p.)
Nie znam sie na C# ale linia 55 i 56: gdzie to jest zamykane?
0 głosów
odpowiedź 9 czerwca 2018 przez MsMaciek123 Pasjonat (24,760 p.)
Znam C++ , więc sproboj tak

sprawdz.close

sprawdz.clear

Albo sp.clear

Musisz wyczyścić zajmowany bufor na dysku. W sensie zwolnić plik, aby mógł być używany potem.

Podobne pytania

+1 głos
2 odpowiedzi 703 wizyt
pytanie zadane 13 kwietnia 2021 w C# przez mateusz45 Gaduła (3,280 p.)
+2 głosów
0 odpowiedzi 305 wizyt
0 głosów
1 odpowiedź 735 wizyt

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

62,799 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...