Это примерно худший из возможных способов использования FileStream
в цикле:
int b_input = file.ReadByte();
file.Position--;
file.WriteByte(encrypt_byte(b_input,password,file.Position));
file.Position++;
Хорошо, первая строка неплохая.Вторая строка заставляет поток очищать свой буфер записи и делать недействительным свой буфер чтения.Затем мы записываем новый байт и снова корректируем позицию, вызывая еще одну очистку и аннулирование (и заставляя нас пропускать каждый второй байт для загрузки, потому что WriteByte
уже обновил позицию файла).
Простое решениеиспользовать File.ReadAllBytes
и просто работать в памяти.Однако, как вы сами заметили, это не работает для больших файлов.
Вместо этого вам следует работать с буфером разумного размера (скажем, var buffer = new byte[4096];
), а затем использовать file.Read
для чтения файла вломти 1 .Лучше, если вы также можете использовать отдельный поток, указывающий на второй файл для стороны записи, так что вы по-прежнему извлекаете выгоду из буферов с обеих сторон.
Вы должны поддерживать свой собственный счет позиции в файле, а нечем полагаться на свойство Position
файла, и ваш цикл должен завершиться, когда Read
вернет 0
(но убедитесь, что вы всегда обращаете внимание на это значение и обрабатываете только большую часть буфера).
Наконец, закройте оба потока, удалите старый файл и переместите / переименуйте новый файл, чтобы заменить его.
Обратите внимание, что этот вид «шифрования» подходит для использования в игрушках, но не долженсерьезно используется для чего угодно.Вы уже знаете о пространстве имен System.Security.Cryptography
.Для любой серьезной работы по шифрованию вы должны искать уже существующие классы, а не свои собственные.
1 Также рассмотрите возможность использования Async
вариантов.Большую часть времени все равно будет потрачено на ввод / вывод .Блокировка потока, пока это происходит, не увеличивает ценность системы.