【问题标题】:Binary Reader and Writer open at same time?二进制读取器和写入器同时打开?
【发布时间】:2011-12-28 04:59:49
【问题描述】:

我正在编写处理使用哈希的文件的代码。我需要读取一个块,然后散列它,然后写入它,然后读取另一个块,等等。

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

是否有可能,并且可以接受如下操作:

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

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

【问题讨论】:

  • 我认为这很脏。你为什么这样做?也许你可以解释一下你的场景?

标签: c# filestream binaryreader binarywriter


【解决方案1】:

这是完全可能和期望的,一个技术性的,如果你的写方法不改变文件的长度并且总是落后于读者,这不应该带来任何问题。事实上,从 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);
}

【讨论】:

  • @Walkerneo - 你可以,但我不推荐。文件句柄通过缓存进行了优化,搜索没有优化(做一个测试,你会看到)。除此之外,我的观点是允许 API 的灵活性和安全性,当您只使用 1 个文件句柄进行读取和写入时,您将失去这些灵活性和安全性
  • 稍作修改:两次打开文件似乎并没有像这里描述的那样工作。但是如果流很常见,它已经可以正常工作了:using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) using (var reader = new BinaryReader(stream)) using (var writer = new BinaryWriter(stream)) { ... }
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2015-06-16
  • 1970-01-01
相关资源
最近更新 更多