【问题标题】:Convert MemoryStream to FileStream creates hundreds of identical files?将 MemoryStream 转换为 FileStream 会创建数百个相同的文件?
【发布时间】:2009-02-17 07:28:14
【问题描述】:

我正在访问一个返回 pdf 文件作为响应的 httpwebrequest。我正在将该响应读入内存流,然后再转换为文件。问题是,正在创建数百个文件。不知道为什么,我尝试了很多方法,而且都一样...... 这是第一个返回内存流的方法。

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

第二次转换为 FileStream...

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.CreateNew);
            fs.Write(data, 0, data.Length);

有什么想法吗?

编辑以添加更多代码...

    public MemoryStream GetToStream()
    {
        if (_Req == null)
            throw new Exception("HttpWebRequest is not initialised");

        GetResult(_Req);

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

        _ResponseStream.Close();

        if (memStream.Length > 0)
            return memStream;
        else return null;
    }

newFile 是要创建的文件的服务器的映射路径。

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.Create);
            fs.Write(data, 0, data.Length);
            fs.Close();

我试过stream.WriteTo(fs),同样的事情发生了。很奇怪。

【问题讨论】:

    标签: file-io filestream memorystream


    【解决方案1】:

    目前还不清楚为什么会获得多个文件,但您应该能够根据文件名获得一些信息 - 每个文件都对应于 newFile 的值。

    顺便说一下,我注意到您并没有关闭文件流。使用File.WriteAllBytes 是实现目标的一种更简单的方法,并且不需要您关闭任何内容:

    byte[] data = stream.ToArray();
    File.WriteAllBytes(newFile, data);
    

    另一种方法是仍然使用FileStream(带有using 语句),但使用MemoryStream.WriteTo 来避免调用ToArray,它必须复制所有数据:

    using (FileStream fs = File.Create(newFile))
    {
        stream.WriteTo(fs);
    }
    

    【讨论】:

      【解决方案2】:

      我建议您收到的客户请求比您想象的要多。检查您的网络服务器访问日志文件。您显示的代码 sn-ps 似乎合理,但并没有真正显示足够的代码来解释问题 - 您没有显示代码的正确部分。无论如何,请检查访问日志或使用某种跟踪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        相关资源
        最近更新 更多