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

HackNation - ogólnopolski hackathon
0 głosów
4,428 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 862 wizyt
pytanie zadane 13 kwietnia 2021 w C# przez mateusz45 Gaduła (3,300 p.)
+2 głosów
0 odpowiedzi 355 wizyt
0 głosów
1 odpowiedź 819 wizyt

93,628 zapytań

142,551 odpowiedzi

323,051 komentarzy

63,133 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1936p. - dia-Chann
  2. 1916p. - DziarnowskiJ
  3. 1886p. - Łukasz Piwowar
  4. 1841p. - raydeal
  5. 1840p. - Adrian Wieprzkowicz
  6. 1782p. - rucin93
  7. 1640p. - CC PL
  8. 1616p. - Maurycy W
  9. 1588p. - Tomasz Bielak
  10. 1521p. - Michal Drewniak
  11. 1491p. - Rafał Trójniak
  12. 1471p. - rafalszastok
  13. 1444p. - robwarsz
  14. 1257p. - ssynowiec
  15. 1208p. - Mariusz Fornal
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...