标签: memorystream

C#将MemoryStream转换为FileStream

我的代码是这样的:

byte[] byteArray = Encoding.ASCII.GetBytes(someText);
MemoryStream stream = new MemoryStream(byteArray);
StreamReader reader = new StreamReader(stream);
FileStream file = (FileStream)reader.BaseStream;
Run Code Online (Sandbox Code Playgroud)

后来我正在使用file.Name.

我收到一个InvalidCastException:它显示如下

无法将类型为"System.IO.MemoryStream"的对象强制转换为"System.IO.FileStream".

我在某处读到了我应该将FileStream更改为Stream.还有什么我应该做的吗?

c# memorystream stream filestream

6
推荐指数
2
解决办法
8657
查看次数

即使在MemoryStream.Close()之后,对MemoryStream.GetBuffer()的调用也会成功; 为什么?

我在一些开源代码中找到了以下构造:

var mstream = new MemoryStream();
// ... write some data to mstream
mstream.Close();
byte[] b = mstream.GetBuffer();
Run Code Online (Sandbox Code Playgroud)

我认为这段代码会有"意外"的行为并且可能抛出异常,因为调用Close应该有效地Dispose根据MSDN文档进行调用.

但是,据我所知,从实验开始,调用GetBuffer()始终成功并返回有效结果,即使我Thread.Sleep持续20秒或通过实施垃圾收集GC.Collect().

如果调用GetBuffer()即使成功Close/ Dispose?在这种情况下,为什么不释放底层缓冲区MemoryStream

c# garbage-collection dispose memorystream

6
推荐指数
2
解决办法
1580
查看次数

将内存流写入文件

我已经尝试将json格式的数据检索为字符串并将其写入文件,并且效果很好.现在我正在尝试使用MemoryStream来做同样的事情,但没有任何东西被写入文件 - 仅仅是[{},{},{},{},{}]而没有任何实际数据.

我的问题是 - 如何检查数据是否确实正确地进入内存流,或者问题是否发生在其他地方.我知道myList确实包含数据.

这是我的代码:

MemoryStream ms = new MemoryStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(List<myClass>));
dcjs.WriteObject(ms, myList);

using (FileStream fs = new FileStream(Path.Combine(Application.StartupPath,"MyFile.json"), FileMode.OpenOrCreate))
{
                ms.Position = 0;
                ms.Read(ms.ToArray(), 0, (int)ms.Length);
                fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
                ms.Close();
                fs.Flush();
                fs.Close();
 }
Run Code Online (Sandbox Code Playgroud)

c# json memorystream

6
推荐指数
1
解决办法
4万
查看次数

Open XML SDK-使用MemoryStream作为docx持有者从模板(dotx)创建docx

我正在尝试dotx使用OpenXML2.5库从单词模板(。)创建一个.docx文件。更确切地说,我想跟随这个,但我想用一个打开文档MemoryStream的文件,而不是路径。

因此,在上面的链接中,方法是这样的:将模板文件复制到磁盘上的新文件中。以打开新文件WordProcessingDocument,将其类型更改为Document并添加对模板的引用(我不确定为什么这样做是必要的...)

我需要的是。从数据库获取我的模板作为字节数组。将数组复制到流中,并以形式打开WordProcessingDocument。然后执行与上述相同的操作。我不想在磁盘上使用临时文件,等等。我不明白的是为什么我应该在新文档中引用模板文件(实际上,检查docx存档中的xml文件,它只是添加了一个包含模板名称的xml节点...为什么?)

现在,我的问题是,如果我使用a MemoryStream而不是文件的物理路径,则导致docx损坏。我收到“ Microsoft Office无法打开此文件,因为某些部分丢失或无效 ”。如果我使用临时磁盘文件,则可以使用。为什么会这样呢?

简化后,我的代码如下所示:

byte[] result = null;
byte[] templateBytes = System.IO.File.ReadAllBytes("template.dotx");
using (MemoryStream templateStream = new MemoryStream())

{
    templateStream.Write(templateBytes, 0, (int)templateBytes.Length);

    using (WordprocessingDocument doc = WordprocessingDocument.Open(templateStream, true))
            {
                doc.ChangeDocumentType(WordprocessingDocumentType.Document);
                var mainPart = doc.MainDocumentPart;

                //Here I should create an AttachedTemplate object and assign a relationship id to it, which also implies
                //setting a "reference" to the template ? I'm not …
Run Code Online (Sandbox Code Playgroud)

templates memorystream corrupt docx openxml-sdk

6
推荐指数
1
解决办法
3342
查看次数

从MemoryStream返回时,ASP.net MVC ActionResult会破坏excel文件

我在Controller中有以下操作

public ActionResult DownloadExcel()
        {
            //create and populate Excel file here
            C1XLBook testBook = new C1XLBook(); 
            //populate it here

            MemoryStream ms = new MemoryStream();
            testBook.Save(ms, FileFormat.Biff8);

            return File(ms, "application/ms-excel", "test-file.xls");           
        }
Run Code Online (Sandbox Code Playgroud)

打开文件时,我收到Excel消息,指出该文件与扩展名不匹配,文件打开已损坏.

如果我将文件保存在硬盘驱动器上并从那里返回,一切都很好:

return base.File(@"C:\LOGS\test-file.xls", "application/ms-excel", "test-excel.xls");
Run Code Online (Sandbox Code Playgroud)

我最初认为保存功能在将其保存到MemoryStream时会破坏它,所以我保存并重新加载它并且很好地传回给用户 - 当保存在硬盘驱动器上并从那里返回时,而不是从的MemoryStream

有任何想法吗?我不太喜欢将文件保存在硬盘上....此外我应该能够将它保存到MemoryStream并从那里返回它?

我有一个预感,也许MemoryStream不应该用于返回MVC中的文件,因为每个请求都是隔离的?

excel memorystream asp.net-mvc-3

5
推荐指数
1
解决办法
2588
查看次数

将内存流表示为物理文件

我今天遇到了一个愚蠢的问题:

在我的项目中我必须使用一个库(我无法替换),他的问题是我正在使用MemoryStream而不是经常保存到 HDD(因为文件很多,而且它们的大小很小,所以它很完美为MemoryStream)。问题是库 API 是围绕文件系统访问构建的 - 其中一个函数只接受文件的直接路径。

我如何仍然向该方法发送一个字符串(路径),从而在FileStream不实际接触硬盘的情况下创建一个新的?

例如“\MEMORY\myfile.bin”?

c# filesystems api memorystream

5
推荐指数
1
解决办法
1665
查看次数

MemoryStream使用多少内存?

我有一台2 GB的机器.在运行我的exe之前,我有1.1 GB的可用内存.当我运行下面只能找到一行的exe时,我就会出现内存异常.

我期待以下行使用大约6亿字节的内容.MemoryStream类使用的内存多于初始化容量吗?

MemoryStream memory = new MemoryStream(600000000);
Run Code Online (Sandbox Code Playgroud)

.net memorystream

5
推荐指数
1
解决办法
358
查看次数

在带有MemoryStream的xml末尾有很多意想不到的"nul"字符

我为用户编写了一个动作,用于下载生成的xml,而不必将其写入服务器磁盘,但将其保存到内存中.

这是我的代码:

public FileContentResult MyAction()
{
  MemoryStream myStream = new MemoryStream();
  XDocument xml = GenerateXml(...);
  xml.Save(myStream );
  myStream .Position = 0;
  return File(myStream.GetBuffer(), "text/xml", "myFile.xml");
}
Run Code Online (Sandbox Code Playgroud)

一切似乎工作正常,XML是正确的,我可以下载文件,但我不明白为什么我的文件末尾有691920"nul"caracters(这些caracters的数量似乎与长度有关)的xml):

在此输入图像描述

它们来自哪里?我怎么能摆脱它们?

[更新]我试过这个:

public FileContentResult MyAction()
{
  XDocument xml = GenerateXml(...);
  byte[] bytes = new byte[xml.ToString().Length * sizeof(char)];
  Buffer.BlockCopy(xml.ToString().ToCharArray(), 0, bytes, 0, bytes.Length);
  return File(bytes, "text/xml", "myFile.xml");
}
Run Code Online (Sandbox Code Playgroud)

我没有得到"nul"角色.所以我想这是MemoryStream在文件末尾添加额外的caracters.所以在我的例子中,第二个代码解决了我的问题.

但我也生成了一个我无法阅读的Word文档(由于内容存在问题,因此无法打开xxx.docx).我想我在这里遇到同样的问题,内存流在文件末尾添加额外的caracters并破坏它.

c# asp.net-mvc memorystream linq-to-xml filecontentresult

5
推荐指数
1
解决办法
1587
查看次数

C#中Java的ByteBuffer.wrap相当于什么?

byte[] input = new byte[] {2, 4, 5, 2, 1};
ByteBuffer bytebuf = ByteBuffer.wrap(input);
Run Code Online (Sandbox Code Playgroud)

ByteBuffer.wrap(byte[] array) 方法使缓冲区和数组相互连接,对缓冲区的修改将导致数组被修改,反之亦然.

ByteBufferC#中的等价物是memorystream.但我不知道如何连接内存流与数组喜欢的ByteBuffer.wrap()方法.

有人能说出ByteBuffer.wrap()C#中的等价物吗?我到处搜索但根本找不到答案.

提前致谢.

c# java bytebuffer memorystream

5
推荐指数
1
解决办法
6885
查看次数

来自内存流的电子邮件附件在C#中显示为空白

我能够通过邮件发送附件,但附件内容为空白,大小显示为0字节.

在通过互联网进行一些搜索后发现我们需要将内存流位置重置为0才能从头开始.

我也试过了,但它似乎无法正常工作.你能帮忙吗?

请在下面找到我的代码段:

注意:我能够保存工作簿,并且数据存在于保存的工作簿中.

        MemoryStream memoryStream = new MemoryStream();

        StreamWriter writer = new StreamWriter(memoryStream);
        writer.Write(xlWorkbook);
        writer.Flush();
        memoryStream.Position = 0;
        MailMessage mail = new MailMessage();
        SmtpClient SmtpServer = new SmtpClient("smtpclient");
        mail.From = new MailAddress("from@gmail.com");
        mail.To.Add("To@gmail.com");
        mail.Subject = "Entry";
        mail.Body = "Hello, PFA ";
        System.Net.Mail.Attachment attachment;

        attachment = new System.Net.Mail.Attachment(memoryStream,"xls");
        attachment.ContentDisposition.FileName = "Input" + DateTime.Now.ToString("yyyyMMdd_hhss") + ".xls";
        mail.Attachments.Add(attachment);
        SmtpServer.Port = 465;
        SmtpServer.UseDefaultCredentials = false;
        SmtpServer.Credentials = new System.Net.NetworkCredential("Username", "password");
        SmtpServer.EnableSsl = true;
        SmtpServer.Send(mail);
        writer.Dispose();
Run Code Online (Sandbox Code Playgroud)

.net c# email memorystream email-attachments

5
推荐指数
1
解决办法
1万
查看次数