MemoryStream mem = new MemoryStream();
            FileStream fs = new FileStream(xxxx);
            byte[] buff = mem.ToArray();
            fs.Write(buff, 0, buff.Length);

解决方案 »

  1.   

    MemoryStream ms = ...
    FileStream fs = new Filestream();
    fs.Write(ms.GetBuffer(), 0, ms.Position);
      

  2.   

    这种方式我也有使用,但建议使用using,更加安全 using(MemoryStream mem = new MemoryStream())
    {
                using(FileStream fs = new FileStream(xxxx))
                {
                     byte[] buff = mem.ToArray();
                     fs.Write(buff, 0, buff.Length);
                }
    }但这种方式在并发大情况下不推荐使用,从代码上可以看出,它会占用mem.ToArray()容量的内存。如果你的mem对象中本身就有大量数据,并且是在大并发的环境下,那么服务器很容易挂掉。
    其实你完全可以将for循环代码封装在一个函数中,就不用每次都重新写了。
      

  3.   

    这种方式我也有使用,但建议使用using,更加安全 using(MemoryStream mem = new MemoryStream())
    {
                using(FileStream fs = new FileStream(xxxx))
                {
                     byte[] buff = mem.ToArray();
                     fs.Write(buff, 0, buff.Length);
                }
    }但这种方式在并发大情况下不推荐使用,从代码上可以看出,它会占用mem.ToArray()容量的内存。如果你的mem对象中本身就有大量数据,并且是在大并发的环境下,那么服务器很容易挂掉。
    其实你完全可以将for循环代码封装在一个函数中,就不用每次都重新写了。
    既然都用了using了,为什么不加上close?
      

  4.   


    谢谢,不过这里有个小问题,(1)fs.Write函数的第三个参数是int,而ms.Position是个long类型的属性。如果ms内容很多的话,Position当中的long可能会比int的max还要大。这不就溢出了吗?
    (2)GetBuffer()函数是返回了一个原有对象字节流的引用呢,还是返回了ms的内容的拷贝? 如果是一份拷贝的话,有么有办法能避免这种拷贝?谢谢。
      

  5.   

    而且这句话是编译不过的:fs.Write(ms.GetBuffer(), 0, ms.Position);error CS1503: Argument 3: cannot convert from 'long' to 'int'
      

  6.   

    MemoryStream有两个函数,一个是ToArray,一个是GetPosition,都是返回byte[]。
    那么这个两个函数有什么区别吗?
      

  7.   

    好比你一个容量是1024 实际你装了1000ToArray()是返回1000的Byte
    GetBuffer() 是返回1024()
      

  8.   

    这种方式我也有使用,但建议使用using,更加安全 using(MemoryStream mem = new MemoryStream())
    {
                using(FileStream fs = new FileStream(xxxx))
                {
                     byte[] buff = mem.ToArray();
                     fs.Write(buff, 0, buff.Length);
                }
    }但这种方式在并发大情况下不推荐使用,从代码上可以看出,它会占用mem.ToArray()容量的内存。如果你的mem对象中本身就有大量数据,并且是在大并发的环境下,那么服务器很容易挂掉。
    其实你完全可以将for循环代码封装在一个函数中,就不用每次都重新写了。
    既然都用了using了,为什么不加上close?
    因为using展开的代码中就包含了对close的调用,所以一般不用调用close。
    只有实现了IDisposable接口的类采用使用using
    在Dispose方法中,释放资源,例如调用你说的close
      

  9.   

    MemoryStream类里面没有GetPosition的定义吧
    参考:http://msdn.microsoft.com/zh-cn/library/system.io.memorystream_methods(v=vs.110).aspx
      

  10.   

    出错的地方时第三个参数ms.Position,如果转换一下就可以了
    fs.Write(ms.GetBuffer(), 0, (int)ms.Position)
    这里,GetBuffer的确不会建立内存副本,而第三个参数ms.Position实际上就是ms.Length(如果你没有改变Position值的话)