• 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.

VPS Starter Arubacloud
0 głosów
3,768 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 402 wizyt
pytanie zadane 13 kwietnia 2021 w C# przez mateusz45 Gaduła (3,240 p.)
+2 głosów
0 odpowiedzi 209 wizyt
0 głosów
1 odpowiedź 436 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...