标签: memorystream

为什么MemoryStream.GetBuffer()总是抛出?

以下代码将始终抛出UnuthorizedAccessException(无法访问MemoryStream的内部缓冲区.)

byte[] buf1 = { 2, 3, 5, 7, 11 };
var ms = new MemoryStream(buf1);
byte[] buf2 = ms.GetBuffer();      // exception will be thrown here
Run Code Online (Sandbox Code Playgroud)

这是一个普通的旧控制台应用程序,我作为管理员运行.我无法想象我可以给出这个代码更具特权的设置.那么为什么我不能进入这个缓冲区呢?(如果没有人可以,GetBuffer方法有什么意义?)

MSDN文档说

要使用公共可见缓冲区创建MemoryStream实例,请使用MemoryStream,MemoryStream(array [],Int32,Int32,Boolean,Boolean)或MemoryStream(Int32).

我不这样做吗?

PS我不想使用ToArray(),因为它会复制.

windows memorystream exception getbuffer

18
推荐指数
3
解决办法
2万
查看次数

MemoryStream有一个线程写入它和另一个读取

这是我写入流然后使用1个线程从它读取的方式:

        System.IO.MemoryStream ms = new System.IO.MemoryStream();

        // write to it
        ms.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 7);

        // go to the begining
        ms.Seek(0, System.IO.SeekOrigin.Begin);

        // now read from it
        byte[] myBuffer = new byte[7];
        ms.Read(myBuffer, 0, 7);
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否可以从一个线程写入内存流并从单独的线程中读取该流.

c# multithreading memorystream stream

17
推荐指数
1
解决办法
7305
查看次数

从动作返回文件时,流是否会被处置?

我正在写一个字符串,MemoryStream我需要将流返回到Controller Action,所以我可以将其作为文件发送下载.

通常,我将Stream包装在using语句中,但是,在这种情况下,我需要返回它.我退货后还能处理吗?或者我需要以某种方式自行处理它?

//inside CsvOutputFormatter
public Stream GetStream(object genericObject)
{
    var stream = new MemoryStream();
    var writer = new StreamWriter(stream, Encoding.UTF8);
    writer.Write(_stringWriter.ToString());
    writer.Flush();
    stream.Position = 0;
    return stream;
}
Run Code Online (Sandbox Code Playgroud)

Controller返回文件的Action:

[HttpGet]
[Route("/Discussion/Export")]
public IActionResult GetDataAsCsv()
{
    var forums = _discussionService.GetForums(_userHelper.UserId);

    var csvFormatter = new CsvOutputFormatter(new CsvFormatterOptions());

    var stream = csvFormatter.GetStream(forums);
    return File(stream, "application/octet-stream", "forums.csv");

    //is the stream Disposed here automatically?
}
Run Code Online (Sandbox Code Playgroud)

c# memorystream streamwriter asp.net-core-mvc asp.net-core

16
推荐指数
1
解决办法
3758
查看次数

调用Stream.Write和使用StreamWriter有什么区别?

实例化一个Stream对象有什么区别,例如MemoryStream调用memoryStream.Write()方法写入流,然后StreamWriter用流实例化一个对象并调用streamWriter.Write()

请考虑以下情形:

你有一个方法,它接受一个Stream,写一个值,然后返回它.稍后将读取流,因此必须重置位置.有两种可能的方法(两者似乎都有效).

// Instantiate a MemoryStream somewhere
//     - Passed to the following two methods
MemoryStream memoryStream = new MemoryStream();

// Not using a StreamWriter
private static Stream WriteToStream(Stream stream, string value)
{
    stream.Write(Encoding.Default.GetBytes(value), 0, value.Length);
    stream.Flush();
    stream.Position = 0;
    return stream;
}

// Using a StreamWriter
private static Stream WriteToStreamWithWriter(Stream stream, string value)
{
    StreamWriter sw = new StreamWriter(stream);
    sw.Write(value, 0, value.Length);
    sw.Flush();
    stream.Position = 0;
    return stream; …
Run Code Online (Sandbox Code Playgroud)

c# memorystream streamwriter

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

为什么写入MemoryStream比写文件慢?

在我的Azure角色代码中,我下载了一个400兆字节的文件,该文件被拆分为10兆字节的块并存储在Blob存储中.我CloudBlob.DownloadToStream()用于下载.

我尝试了两种选择.一个是使用FileStream- 我创建一个"写" FileStream并逐个下载块到同一个流而不倒带,所以我最终得到一个原始文件.另一个选择是MemoryStream通过传递一个比原始文件大小稍大的数字作为流大小(以避免重新分配)并将块下载到其中来创建对象MemoryStream- 这样我最终得到一个MemoryStream保存原始文件数据.

这是一些伪代码:

var writeStream = new StreamOfChoice( params );
foreach( uri in urisToDownload ) {
    blobContainer.GetBlobReference( uri ).DownloadToStream( writeStream );
}
Run Code Online (Sandbox Code Playgroud)

现在唯一的区别是,它是FileStream一个案例而另一个案例,MemoryStream其余部分是相同的.事实证明,它需要大约20秒,FileStream大约需要30秒MemoryStream- 是的,FileStream结果更快.根据\Memory\Available Bytes性能计数器,虚拟机在MemoryStream创建之前具有大约1千兆字节的可用内存,因此不是由于分页.

为什么写入文件的速度要快于MemoryStream

.net c# file-io memorystream azure

15
推荐指数
1
解决办法
2197
查看次数

内存流是否像文件流一样阻塞

我正在使用一个库,要求我提供一个实现此接口的对象:

public interface IConsole {
    TextWriter StandardInput { get; }
    TextReader StandardOutput { get; }
    TextReader StandardError { get; }
}
Run Code Online (Sandbox Code Playgroud)

然后,对象的读者将被库使用:

IConsole console = new MyConsole();
int readBytes = console.StandardOutput.Read(buffer, 0, buffer.Length);
Run Code Online (Sandbox Code Playgroud)

通常,实现IConsole的类具有来自外部进程的StandardOutput流.在这种情况下,console.StandardOutput.Read通过阻塞来调用,直到有一些数据写入StandardOutput流.

我要做的是创建一个测试IConsole实现,它使用MemoryStreams和echo在StandardInput上显示的任何内容返回到StandardInput.我试过了:

MemoryStream echoOutStream = new MemoryStream();
StandardOutput = new StreamReader(echoOutStream);
Run Code Online (Sandbox Code Playgroud)

但问题是console.StandardOutput.Read将返回0而不是阻塞,直到有一些数据.无论如何,如果没有可用数据或者我可以使用的内存流有什么不同,我可以得到一个MemoryStream来阻止吗?

c# memorystream stream

14
推荐指数
2
解决办法
3505
查看次数

从DataUrl转换为C#中的Image并写入包含字节的文件

你好,我有这样的签名:

在此输入图像描述

这个字符串专门编码到DataUrl:

"data:image/png; base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAADICAYAAADGFbfiAAAYlElEQVR4Xu2dC8w1R1nHQSCIgIKVGLmoiLciFwUs ...(long string)"

我想要做的是将此DataUrl转换为PNG图像,并将图像保存到设备,这是我到目前为止所做的:

if (newItem.FieldType == FormFieldType.Signature)
{
     if (newItem.ItemValue != null)
     {
           //string completeImageName = Auth.host + "/" + li[i];
           string path;
           string filename;
           string stringName = newItem.ItemValue;

           var base64Data = Regex.Match(stringName, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
           var binData = Convert.FromBase64String(base64Data);

           path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

           filename = Path.Combine(path, base64Data);

           if (!File.Exists(filename))
           {
                 using (var stream = new MemoryStream(binData))
                 {
//Code crashing here--------------------------
                      File.WriteAllBytes(filename, binData);
                  }
            }

        newItem.ItemValue = filename;

    }
}

         App.Database.SaveReportItem(newItem);
Run Code Online (Sandbox Code Playgroud)

但是我的代码使我的应用程序在此行中专门崩溃:

File.WriteAllBytes(filename,binData);

我用作参考(Link)的样本使用的是PictureBox,但是使用Xamarin时没有使用pictureBox.

有任何想法吗?

.net c# memorystream xamarin xamarin.forms

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

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

在内存中写入文本文件并使用savefiledialog保存

我试图在内存中创建一个文本文件,添加一些行,最后将文件保存在文本文件中.我可以处理savedialog部分,但我不知道如何从内存中获取文本文件.任何帮助和提示都将受到关注.

到目前为止我所做的是:

//Initialize in memory text writer
MemoryStream ms = new MemoryStream(); 
TextWriter tw = new StreamWriter(ms);

tw.WriteLine("HELLO WORLD!");
tw.WriteLine("I WANT TO SAVE THIS FILE AS A .TXT FILE!);
Run Code Online (Sandbox Code Playgroud)

请注意 我将调用tw.WriteLine()在不同的地方添加更多行,所以我想在程序结束时保存它(所以这个主题应该包含在使用{}之类的东西中)

UPDATE

StringBuilder似乎是一个更可靠的选择!当我使用MemoryStream执行此操作时,我的文本文件中出现了奇怪的剪切.

谢谢.

c# memorystream savefiledialog textwriter

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

MemoryStream,无法访问已关闭的流

使用sharpPDF库我生成一个pdf内存流,我想通过电子邮件直接发送它.但行ms.Seek(....给出一个ObjectDisposedException;

无法访问封闭的Stream.

pdf.CreatePDF方法接受(输出)fileName字符串或(out)Stream.但我想它也关闭了流?我不习惯在溪流上工作太多,所以如果你能告诉它应该怎么做?

可以在此处找到CreatePDF方法的sharpPDF源代码:

http://www.java2s.com/Open-Source/CSharp/PDF/SharpPDF/sharpPDF/pdfDocument.cs.htm

Public Sub SendPDF()
   Dim pdf As New sharpPDF.pdfDocument("Title", "Author")

   '....Generate pdf content

   Dim ms As New IO.MemoryStream
   pdf.CreatePDF(ms)

   Dim email As New EmailService
   email.Send(ms)

End Sub

Public Class EmailService
   Public Sub Send(Byval ms as Stream)
        ms.Seek(0, IO.SeekOrigin.Begin)

        Dim atc As New Attachment(ms, "Report.pdf")
        mail.Attachments.Add(atc)

        '....set other email parameters

        client.SendAsync(mail, mail.Subject)
  End Sub 
End Class
Run Code Online (Sandbox Code Playgroud)

.net pdf-generation memorystream sharppdf

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