С# — запись в файл с файловым потоком

Это правильный способ использования Filestream? Если да, то можно ли что-то улучшить в этой функции? Его в основном планируется использовать для записи в ftp-папку, содержащую 600+ строк данных.

Меня беспокоит цикл for.

Я впервые использую C# для работы. Так что могу воспользоваться советом.

private void button3_Click(object sender, EventArgs e)
        {//FINISH BUTTON
            if (string.IsNullOrEmpty(FilePathBox.Text) || string.IsNullOrEmpty(FileNameBox.Text))
            {
                MessageBox.Show("Please check folderpath or filename.", 
                    "WARNING");
            }
            else
            {
                String vFullPath = FilePathBox.Text + "/" + FileNameBox.Text + ExtentionBox.Text;
                MainProgressBar.Maximum = OutputBox.Items.Count;

                using (FileStream fs = File.Create(vFullPath))
                {

                    for (int i = 0; i < OutputBox.Items.Count; i++)
                    {
                        //String vInput = OutputBox.Items[i].ToString() + "\n";
                        //File.AppendAllText(vFullPath, vInput);
                        String vInput = OutputBox.Items[i].ToString() + "\n";
                        byte[] vData = new UTF8Encoding(true).GetBytes(vInput);
                        fs.Write(vData, 0, vData.Length);
                        MainProgressBar.Value = i;
                    }
                }

                MainProgressBar.Value = MainProgressBar.Maximum;
                MessageBox.Show("Finished Writing to file.",
                    "Completed");
            }
        } 

Не так уж и плохо для новичка. Возможно, вы захотите, чтобы нет выполнял файловый ввод-вывод в потоке отправки событий. Итак, можно рассмотреть возможность создания обработчика событий async void и запуска и ожидания задачи, в которую вы перемещаете все файловые операции ввода-вывода. Тогда ваше приложение остается отзывчивым. Остальное детали. Например. вам не нужно создавать новый экземпляр Encoding на каждой итерации... но по одному шагу за раз.

Fildor 17.03.2022 10:18

Вы также можете переименовать кнопку (и все обработчики событий) во что-то значимое вместо «button3».

Fildor 17.03.2022 10:20

@Fildor, спасибо за совет! Я немного посмотрю на асинхронный способ. Может у вас есть наглядный пример? Или некоторые документы, которые я могу изучить?

P_kidz 17.03.2022 11:12

На самом деле я бы порекомендовал просто поискать некоторые термины, такие как «асинхронная задача» вместе с «C#», на YouTube, и, конечно же, вы получите кучу обучающих видео для начала.

Fildor 17.03.2022 11:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Более типичным подходом было бы обернуть поток в StreamWriter, у него есть написать методы для строк, что устраняет необходимость конвертировать все в байты. Вы можете выбрать кодировку в конструкторе. Существует также BinaryWriter для записи двоичных данных.

Запись данных в цикле не проблема. Возможно, вы могли бы создать полную строку в памяти с помощью String.Join вместо этого и использовать File.WriteAllLines, но я не ожидаю, что вы получите много.

Мой предпочтительный метод отчета о прогрессе — запустить работу в фоновом потоке с помощью Task.Run, установить свойство, описывающее прогресс в общем объекте, и создать таймер в потоке пользовательского интерфейса, который опрашивает указанное свойство и обновляет индикатор выполнения. Это помогает обеспечить отзывчивость пользовательского интерфейса.

Я бы также подумал об использовании какой-нибудь библиотеки сериализации, например json.net. Это значительно упрощает процесс превращения объекта в файл и обратно. Но это менее актуально для таких вещей, как ведение журнала.

Просто хотел бы добавить: для отчета о прогрессе есть Progress<T>, и это здорово.

Fildor 17.03.2022 10:56

Другие вопросы по теме