Из-за чего в нижеприведенном коде возникает ArgumentException с сообщением “Поток был недоступен для чтения”?

227
02 ноября 2017, 04:15
class Program
{
    static void Main(string[] args)
    {
        string name_f1 = "input.txt";
        string name_f2 = "otput.txt";
        FileStream inp_f = new FileStream(name_f1, FileMode.Create);
        StreamWriter write_f1 = new StreamWriter(inp_f);
        Console.WriteLine("Введите входные данные: ");
        string inp_data = Console.ReadLine();
        write_f1.Write(inp_data);
        write_f1.Close();
        FileStream out_f = new FileStream(name_f2, FileMode.Create);
        try
        {
            StreamReader reader_f = new StreamReader(inp_f);
            string content_f = reader_f.ReadToEnd();
            StreamWriter write_f2 = new StreamWriter(out_f);
            write_f2.Write(content_f);
            reader_f.Close();
            write_f2.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.ReadKey();
        }
    }
}

В приведенном выше коде происходит ArgumentException с сообщением "Поток был недоступен для чтения". Сначала я подумал, что я рано закрываю поток или его вообще не надо закрывать, но ни то ни другое не помогло. Как мне кажется, ошибка происходит в следующем участке кода:

FileStream out_f = new FileStream(name_f2, FileMode.Create);
try
{
    StreamReader reader_f = new StreamReader(inp_f);
    string content_f = reader_f.ReadToEnd();
    StreamWriter write_f2 = new StreamWriter(out_f);
    write_f2.Write(content_f);
    reader_f.Close();
    write_f2.Close();
}
Answer 1

После записи в поток Вам необходимо переместить указатель на его начало, но в Вашем примере это не поможет, потому что когда Вы закрываете StreamReader, Вы закрываете и Stream, с которым он связан, то есть, Ваше предположение о несвоевременном закрытии потока в общем-то верно, однако, в Вашем коде достаточно много ошибок присущих новичку, поэтому позволю себе привести свой вариант кода:

class Program
{
    static void Main(string[] args)
    {
        /* 
         * Переменные в C# принято именовать в camelCase, а не в under_score,
         * имена лучше давать осмысленные, например, intermediateFileName, но никак не name_f1),
         * кроме того, литеральные значения, которые не будут меняться лучше объявлять константами.
         */
        const string intermediateFileName = "input.txt";
        const string destinationFileName = "otput.txt";

        Console.WriteLine("введите строку: ");
        string input = Console.ReadLine();
        /*
         * Все операции, могущие вызвать исключение должны быть обернуты в try-catch.
         * Все манипуляции с Disposable-типами, такими, как Stream должны быть обернуты в блоки using или,
         * при невозможности, в try-catch-finally.
         */
        Stream intermediateStream = null;
        Stream destinationStream = null;
        try
        {
            intermediateStream = new FileStream(intermediateFileName, FileMode.Create);
            StreamWriter intermediateWriter = new StreamWriter(intermediateStream);
            intermediateWriter.Write(input);
            intermediateWriter.Flush();
            // Устанавливаем указатель на начало потока.
            intermediateStream.Seek(0, SeekOrigin.Begin);
            // Копировать из одного файла в другой лучше все же побайтово через буфер
            destinationStream = new FileStream(destinationFileName, FileMode.Create);
            // Количество байт, прочитанных при последнем чтении
            int lastCount = 0;
            // Буфер длиной 256 байт
            byte[] buffer = new byte[256];
            do
            {
                /*
                 * читаем из входного потока, записываем в выходной, если прочитано меньше, чем размер буфера,
                 * значит поток прочитан полностью
                 */
                lastCount = intermediateStream.Read(buffer, 0, buffer.Length);
                destinationStream.Write(buffer, 0, lastCount);
            }
            while (lastCount == buffer.Length);
        }
        catch (Exception x)
        {
            Console.WriteLine($"Произошла ошибка [{x.Message}]:\r\n\r\n{x.StackTrace}");
        }
        finally
        {
            // Если стримы инициализированы, закрываем их.
            intermediateStream?.Close();
            destinationStream?.Close();
        }
        Console.WriteLine("Нажмите любую клавишу");
        Console.ReadKey();
    }
}
READ ALSO
Анимация в react

Анимация в react

Здравствуйте, начинаю заниматься web-разработкой и возник вопрос как сделать анимацию в react js и как с ней работатьНашел англоязычную статью...

357
push notification react native

push notification react native

Подскажите как лучше реализовать уведомления (Notifications) в react-native

263
Построение маршрута по клику на карте

Построение маршрута по клику на карте

Подскажите, как реализовать следующую задачу: пользователь кликает по карте получает адрес той точки, на которую нажал, далее строится маршрут...

458
Почему не срабатывает getElementByID для input?

Почему не срабатывает getElementByID для input?

В разметке есть поле ввода:

257