2011-12-28 77 views
4

我正在编写处理使用散列的文件的代码。我需要读一块,然后散列它,然后写它,然后读另一个块,等等。Binary Reader和Writer同时打开?

换句话说,我需要做大量的阅读和写作。我敢肯定,这是非常简单的,但我只是想通过专业人士来运行它...

是否有可能和可接受的做一些事情,如:

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

我记得运行到某种在试图打开和写入文件时遇到冲突的文件流错误,我不确定我为了得到它而做了什么。这是两个文件流,这是问题吗?我可以有一个流来读取和写入?

+0

我觉得这很脏。你为什么这样做?也许你可以解释你的情况? – Matthias 2011-12-28 05:02:38

回答

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 2011-12-28 08:22:22

+2

@Walkerneo - 你可以,但我wouldnt推荐它。文件handeles使用缓存进行优化,Seeking没有被优化(做一个测试,你会看到)。除此之外,我的观点是允许API的灵活性和安全性,当你只用一个文件句柄来读写时 – Polity 2011-12-28 10:32:46

相关问题