Не удается записать строку в txt-файл, так как к нему присоединяется другой файл

Я работаю над своего рода чат-ботом, и я пытаюсь кодировать в «обучающей» функциональности. Я довольно новичок в кодировании, но подозреваю, что моя проблема связана с тем, что я не закрываю поток чтения, но я понятия не имею, как. Я хотел бы помочь найти наиболее эффективный способ решения этой проблемы. Вот мой код.

class Program
{
    static bool isRecording = false;
    static bool isTraining = false;
    static bool shutdown = false;

    static string path = Path.Combine(Directory.GetCurrentDirectory(), "memory.txt");

    static string inputValue;
    static string outputValue = " ";

    static void Main(string[] args)
    {
        Console.WriteLine("Computer: Hello! I am MyAI Version 2.0.");
        Console.WriteLine("Training?");
        inputValue = Console.ReadLine();
        inputValue = inputValue.ToLower();
        inputValue = inputValue.Trim(new Char[] { ' ', '.', ',', ':', ';', '*' });


        if (inputValue == "yes")
        {
            isTraining = true;
            Console.WriteLine("Training mode set to true.");
            Console.ReadLine();
        }
        else
        {
            isTraining = false;
            Console.WriteLine("Training mode set to false");
            Console.ReadLine();
        }

        Console.Clear();
        CollectInput();

    }

    static void CollectInput()
    {
        var lines = System.IO.File.ReadLines(path);
        while (!shutdown)
        {
            Console.Write("User: ");
            inputValue = Console.ReadLine();
            inputValue = inputValue.ToLower();
            inputValue = inputValue.Trim(new Char[] { ' ', '.', ',', ':', ';', '*' });
            StringComparison comp = StringComparison.OrdinalIgnoreCase;

            if (inputValue == "hi" || inputValue == "hello" || inputValue == "greetings")
            {
                outputValue = "hi";
            }
            else if (inputValue.Contains("how are you"))
            {
                outputValue = "good";
            }
            else
            {
                if (isTraining)
                {
                    if (isRecording)
                    {
                        //This is where I would like to write inputValue to path
                        isRecording = false;
                    }
                }
                if (File.ReadAllLines(path).Contains(inputValue))
                {
                    outputValue = File.ReadLines(path)
                    .SkipWhile(line => line != inputValue)
                    .Skip(1)
                    .FirstOrDefault();
                }
                else 
                {
                    if (inputValue.Contains("?"))
                    {
                        outputValue = inputValue;
                        //This is where I would like to write inputValue to path
                        isRecording = true;
                    }
                    else
                    {
                        outputValue = "what about it?";
                    }
                }
            }

            Console.Write("Computer: ");
            Console.WriteLine(outputValue);
            outputValue = " ";    
        }
    }
}    

2 ответа

  1. Вместо того , чтобы использоватьFile.ReadLines, File.Openфайл один раз, а затем читать/записывать в него с тем же дескриптором.

  2. Согласно MSDN, https://msdn.microsoft.com/en-us/library/dd383503 (v=110).aspx, File.ReadLines позволяет начать перечисление строк файла, прежде чем они будут прочитаны полностью. Что это говорит мне, что файл, скорее всего, остался открытым в течение некоторого периода времени после начала ваших перечислений.

    Если вам не нужно это асинхронное поведение, просто переключитесь на файл.ReadAllLines. Вы можете повторить их аналогично, и вы должны иметь возможность записывать в файл с файлом.AppendAllLines.