Это вполне возможно и желательно. С технической точки зрения, если ваш метод записи не меняет длину файла и всегда находится позади читателя, это не должно создавать никаких проблем.Фактически, с точки зрения API, это желательно, поскольку это позволяет пользователю контролировать, где читать и куда писать.(Рекомендуется специфицировать запись в другой файл, если во время процесса шифрования произойдет что-то плохое, ваш входной файл не будет испорчен).
Что-то вроде:
protected void Encrypt(Stream input, Stream output)
{
byte[] buffer = new byte[2048];
while (true)
{
// read
int current = input.Read(buffer, 0, buffer.Length);
if (current == 0)
break;
// encrypt
PerformActualEncryption(buffer, 0, current);
// write
output.Write(buffer, 0, current);
}
}
public void Main()
{
using (Stream inputStream = File.Open("file.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (Stream outputStream = File.Open("file.dat", FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
{
Encrypt(inputStream, outputStream);
}
}
Теперь, когда вы используете шифрование, я бы даже рекомендовал выполнить фактическое шифрование в другом специализированном потоке.Это хорошо очищает код.
class MySpecialHashingStream : Stream
{
...
}
protected void Encrypt(Stream input, Stream output)
{
Stream encryptedOutput = new MySpecialHashingStream(output);
input.CopyTo(encryptedOutput);
}