BackgroundWorker для выполнения задачи
namespace CrypteNode
{
public partial class Form1 : Form
{
private string pathFile;
public Form1()
{
InitializeComponent();
}
private void CoderButton_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Всё файлы (*.*) |*.*| Файлы Shirase (*.shirase)|*.shirase";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
pathFile = openFileDialog.FileName;
OpenFile.Text = pathFile.ToString();
DisplayFile(pathFile);
}
}
// функция DisplayFile.
// Она разбивает файл на байты и дает нам на них посмотреть.
void DisplayFile(string strfile)
{
int nCols = 16;
FileStream fs = new FileStream(strfile, FileMode.Open, FileAccess.Read);
long nBytesRead = fs.Length;
if (nBytesRead > 65536 / 4)
nBytesRead = 65536 / 4;
int nLines = (int)(nBytesRead / nCols) + 1;
string[] lines = new string[nLines];
int nBytesToRead = 0;
//for (int i = 0; i < bytesAsInts.Length; i++)
for (int i = 0; i < nLines; i++)
{
StringBuilder nextLine = new StringBuilder();
nextLine.Capacity = 2 * nCols;
for (int j = 0; j < nLines; j++)
{
int nextByte = fs.ReadByte();
nBytesToRead++;
if (nextByte < 0 || nBytesToRead > 65536)
break;
char nextChar = (char)nextByte;
nextLine.Append(" 0x0" + string.Format("{0,1:X}", (int)nextChar));
//nextLine.Append((int)nextChar);
}
lines[i] = nextLine.ToString();
}
fs.Close();
string text = "";
foreach (string l in lines)
text += l;
OutputText.Text = text;
}
// Здесь все просто, читаем файл и просматриваем его в байтах и выводим на экран в отдельном окне.
// Далее, начнем с реализацией функций HEX.На кнопке "шифрования" обработчик с вызова функции Копировать.
// Она у нас будет основной.
private void CoderButton_Copy_Click(object sender, EventArgs e)
{
Copy(pathFile, OpenFile.Text + ".shirase", false);
}
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
}
// Теперь собственным разберем функцию Копиювати.Якщо ей нужно быстро кодировать файл быстро и красиво.
public void Copy(string inputFilePath, string outputFilePath, bool CoderMode)
{
int bufferSize = 1024 * 64;
using (FileStream inStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
{
using (FileStream fileStream = new FileStream(outputFilePath, FileMode.OpenOrCreate, FileAccess.Write))
{
int bytesRead = -1;
byte[] bytes = new byte[bufferSize];
string decodeString = key1.Text;
// входной параметр bool -именно он определяет, что будет: кодирование или декодирование.
// Создаем просторный буфер, создаем классическую обертку FileStream.Read ==> FileStream.Write
// Первая у нас открывает исходный файл, вторая будет сохранять результат в новый файл.
// Готовим массив байтов на bufferSize.Для кодирования HEX используется 18 - символьный ключ. if (decodeString.Count() < 18)
{
MessageBox.Show("Довжина цифрового ключа повинна бути 18 символiв");
return;
}
if (!char.IsDigit(key1.Text, 0))
{
MessageBox.Show("тільки числа");
return;
}
double decodeInt = Convert.ToDouble(decodeString);
int ln = (int)(Math.Log(Math.Log(decodeInt, 2)));
while ((bytesRead = inStream.Read(bytes, 0, bufferSize)) > 0)
{
int[] bytesAsInts = bytes.Select(x => (int)x).ToArray();
if (CoderMode == false)
{
for (int i = 0; i < bytesAsInts.Length; i++)
{
bytesAsInts[i] = ((bytesAsInts[i] - (ln * 2) - 128) * -1);
}
}
// прочитали по-байт файла, перекодировали ASCII-код в integer
// используя конструкцию bytes.Select.ToArray, с помощью bool CoderMode задали режим кодирования.
// затем с каждым int из массива bytesAsInts произвели математическое преобразование используя пару констант и натуральный логарифм.
// Умножение на "минус единицу" сделано, чтобы результат всегда был положительный.
// Функция, реализующая обратный процесс:
else
{
for (int i = 0; i < bytesAsInts.Length; i++)
{
bytesAsInts[i] = ((bytesAsInts[i] * (-1) + ln * 2) + 128);
}
}
byte[] bytes1 = bytesAsInts.Select(x => (byte)x).ToArray();
fileStream.Write(bytes1, 0, bytesRead);
fileStream.Flush();
}
fileStream.Close();
}
}
}
private void CoderButton_Copy1_Click(object sender, EventArgs e)
{
// расшифровки с изменением байтов
string newPathFile = pathFile.Replace(".shirase", "");
Copy(pathFile, newPathFile, true);
}
private void progressBarEncrypting_Click(object sender, EventArgs e)
{
}
private void backgroundWorker_ProgressChanged(object sender,
System.ComponentModel.ProgressChangedEventArgs e)
{
progressBarEncrypting.Value = e.ProgressPercentage;
int indexer = labelProgress.Text.LastIndexOf(" -");
if (indexer != -1)
{
labelProgress.Text = labelProgress.Text.Substring(0, indexer);
}
labelProgress.Text += $" - {e.ProgressPercentage}%";
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void key1_TextChanged(object sender, EventArgs e)
{
key1.MaxLength = 18;
}
private void buttonStopEncryption_Click(object sender, EventArgs e)
{
if (backgroundWorker.IsBusy)
{
backgroundWorker.CancelAsync();
}
}
}
}
private void CoderButton_Click- открыть файл private voidCoderButton_Copy_Click- кодировка private voidCoderButton_Copy1_Click- раскодировка private voidbuttonStopEncryption_Click- стоп private voidprogressBarEncrypting_Click- прогрес бар
Необходимо предотвратить «подвисания» окна при осуществлении шифрования (шифрование должно осуществляться в отдельном вычислительном потоке с помощью класса BackgroundWorker)
Как мне это реализовать, что-то никак не могу приклеить BackgroundWorker и прогрес бар