0

Пытаюсь записать в файл данные, но увы не получается. Пробовал вызвать Close() в деструкторе, пишет что файл уже закрыт. В мейен вызывается только метод AddNote(). В коллекции все хорошо сохраняется. ПОдскажите, в какую сторону копать

using System.IO;
using System.Collections.Generic;

namespace Работа_с_файлом { internal class DataBase { private StreamWriter _writer; private StreamReader _reader; private string _name;

    public List<Service> Services = new List<Service>();

    public DataBase(string name)
    {
        _writer = new StreamWriter(new FileStream("temp.txt", FileMode.Create, FileAccess.Write));
        _reader = new StreamReader(new FileStream(name, FileMode.OpenOrCreate, FileAccess.Read));
        _name = name;
        while (true)
        {
            string line = _reader.ReadLine();

            if (line == null)
                break;

            string[] param = line.Split(' ');
            Service temp = new Service(int.Parse(param[0]), param[1], param[2], param[3]);

            Services.Add(temp);
            _writer.WriteLine(line);
        }
        _reader.Close();
    }
    ~DataBase()
    {
        File.Delete(_name);
        File.Move("temp.txt", _name);
    }
    public void AddNote(Service note)
    {
        Services.Add(note);
        _writer.WriteLine(note.ToString());
    }

    public void RemoveNote(Service note)
    {
        Services.Remove(note);

        _writer.Close();
        File.Move("temp.txt", _name);
        _reader = new StreamReader(new FileStream(_name, FileMode.Open, FileAccess.Read));
        _writer = new StreamWriter(new FileStream("temp.txt", FileMode.Create, FileAccess.Write));

        while (true)
        {
            string line = _reader.ReadLine();

            if (line == null)
                break;

            if (line != note.ToString())
                _writer.WriteLine(line);
        }
        _reader.Close();
    }
    public void ChangeNote(Service source, Service changeble)
    {
        int index = Services.IndexOf(source);
        if (index != -1)
        {
            Services[index] = changeble;
        }

        _writer.Close();
        File.Move("temp.txt", _name);
        _reader = new StreamReader(new FileStream(_name, FileMode.Open, FileAccess.Read));
        _writer = new StreamWriter(new FileStream("temp.txt", FileMode.Create, FileAccess.Write));

        while (true)
        {
            string line = _reader.ReadLine();

            if (line == null)
                break;

            if (line != source.ToString())
                _writer.WriteLine(line);
            else
                _writer.WriteLine(changeble.ToString());
        }
        _reader.Close();

    }
}

}

Вместо деструктора определил метод Close() и там закрыл файл, но всё же интересно, в какой момент _writer успел закрыться или не закрыться вовсе

  • 1
    но увы не получается ??? – tym32167 May 29 '22 at 21:16
  • В качестве костыля вам может помочь Flush/AutoFlush. Но в целом код [цензура]. – Alexander Petrov May 29 '22 at 21:57
  • в деструкторе - в C# нет деструкторов, вы говорите о финализаторе. ~DataBase() финализатор не имеет гарантий вызова, реализуйте IDisposable интерфейс, и вызывайте Dispose() явно. https://ru.stackoverflow.com/a/1138718/373567 вам бы выучить, как пользоваться IDisposable объектами и освоить ключевое слово using. https://ru.stackoverflow.com/a/1410142/373567. – aepot May 29 '22 at 22:06

0 Answers0