Это правильный способ использования 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");
}
}
Вы также можете переименовать кнопку (и все обработчики событий) во что-то значимое вместо «button3».
@Fildor, спасибо за совет! Я немного посмотрю на асинхронный способ. Может у вас есть наглядный пример? Или некоторые документы, которые я могу изучить?
На самом деле я бы порекомендовал просто поискать некоторые термины, такие как «асинхронная задача» вместе с «C#», на YouTube, и, конечно же, вы получите кучу обучающих видео для начала.
Более типичным подходом было бы обернуть поток в StreamWriter, у него есть написать методы для строк, что устраняет необходимость конвертировать все в байты. Вы можете выбрать кодировку в конструкторе. Существует также BinaryWriter для записи двоичных данных.
Запись данных в цикле не проблема. Возможно, вы могли бы создать полную строку в памяти с помощью String.Join
вместо этого и использовать File.WriteAllLines
, но я не ожидаю, что вы получите много.
Мой предпочтительный метод отчета о прогрессе — запустить работу в фоновом потоке с помощью Task.Run
, установить свойство, описывающее прогресс в общем объекте, и создать таймер в потоке пользовательского интерфейса, который опрашивает указанное свойство и обновляет индикатор выполнения. Это помогает обеспечить отзывчивость пользовательского интерфейса.
Я бы также подумал об использовании какой-нибудь библиотеки сериализации, например json.net. Это значительно упрощает процесс превращения объекта в файл и обратно. Но это менее актуально для таких вещей, как ведение журнала.
Не так уж и плохо для новичка. Возможно, вы захотите, чтобы нет выполнял файловый ввод-вывод в потоке отправки событий. Итак, можно рассмотреть возможность создания обработчика событий
async void
и запуска и ожидания задачи, в которую вы перемещаете все файловые операции ввода-вывода. Тогда ваше приложение остается отзывчивым. Остальное детали. Например. вам не нужно создавать новый экземпляр Encoding на каждой итерации... но по одному шагу за раз.