2011-12-28 4 views
4

Я пишу код, который имеет дело с файлом, который использует хеши. Мне нужно прочитать кусок, затем записать его, затем записать его, затем прочитать еще один кусок и т. Д.Двоичный читатель и писатель открыты одновременно?

Другими словами, мне нужно много читать и писать. Я уверен, что это очень просто, но я просто хотел, чтобы запустить его плюсах ...

Можно ли, и приемлемо, чтобы сделать что-то вроде:

BinaryReader br = new BinaryReader (File.OpenRead(path)); 
BinaryWriter bw = new BinaryWriter (File.OpenWrite(path)); 
br.dostuff(); 
bw.dostuff(); 

Я помню, работает в какой-то ошибки конфликтующих файловых потоков при экспериментировании с открытием и записью файлов, и я не уверен, что я сделал, чтобы получить его. Это проблема с двумя файловыми потоками? Могу ли я иметь один поток для чтения и записи?

+0

Я думаю, что это грязный. Почему вы так делаете? Может быть, вы можете объяснить свой сценарий? – Matthias

ответ

2

Это совершенно возможно и желательно, техничность, если ваш метод записи не изменяет длину файла и всегда стоит за читателем, это не должно создавать никаких проблем. На самом деле, с точки зрения 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); 
} 
+0

Оказалось, я мог бы использовать тот же фильтр для обоих ... – mowwwalker

+2

@Walkerneo - Вы можете, но я бы не рекомендовал его. Файл handeles оптимизирован с кэшированием, поиск менее оптимизирован (выполните тест, и вы увидите). Кроме того, я хотел бы указать на гибкость и безопасность API, которые вы потеряете при работе с 1 файловым дескриптором для чтения и записи – Polity