我的代码是这样的:
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.还有什么我应该做的吗?
我在一些开源代码中找到了以下构造:
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?
我已经尝试将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) 我正在尝试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) 我在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中的文件,因为每个请求都是隔离的?
我今天遇到了一个愚蠢的问题:
在我的项目中我必须使用一个库(我无法替换),他的问题是我正在使用MemoryStream而不是经常保存到 HDD(因为文件很多,而且它们的大小很小,所以它很完美为MemoryStream)。问题是库 API 是围绕文件系统访问构建的 - 其中一个函数只接受文件的直接路径。
我如何仍然向该方法发送一个字符串(路径),从而在FileStream不实际接触硬盘的情况下创建一个新的?
例如“\MEMORY\myfile.bin”?
我有一台2 GB的机器.在运行我的exe之前,我有1.1 GB的可用内存.当我运行下面只能找到一行的exe时,我就会出现内存异常.
我期待以下行使用大约6亿字节的内容.MemoryStream类使用的内存多于初始化容量吗?
MemoryStream memory = new MemoryStream(600000000);
Run Code Online (Sandbox Code Playgroud) 我为用户编写了一个动作,用于下载生成的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并破坏它.
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#中的等价物吗?我到处搜索但根本找不到答案.
提前致谢.
我能够通过邮件发送附件,但附件内容为空白,大小显示为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) memorystream ×10
c# ×7
.net ×2
api ×1
asp.net-mvc ×1
bytebuffer ×1
corrupt ×1
dispose ×1
docx ×1
email ×1
excel ×1
filestream ×1
filesystems ×1
java ×1
json ×1
linq-to-xml ×1
openxml-sdk ×1
stream ×1
templates ×1