不确定如何说出这个问题...欢迎编辑!无论如何......这里去了.
我目前使用Crystal Reports生成Pdfs并将输出流式传输给用户.我的代码如下所示:
System.IO.MemoryStream stream = new System.IO.MemoryStream();
stream = (System.IO.MemoryStream)this.Report.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
this.Response.Clear();
this.Response.Buffer = true;
this.Response.ContentType = "application/pdf";
this.Response.BinaryWrite(stream.ToArray());
this.Response.End();
Run Code Online (Sandbox Code Playgroud)
运行此代码后,它将Pdf流式传输到浏览器,打开Acrobat Reader.效果很好!
我的问题是当用户尝试将文件保存为实际文件名时...在这种情况下,它默认为CrystalReportPage.pdf.无论如何我可以设置这个吗?如果是这样,怎么样?
任何帮助,将不胜感激.
在我的程序中,我基本上是在读取文件,对其进行一些处理,然后将其作为内存流传递回主程序,这将由流读取器处理.这将全部由我的主要旁边的班级处理.
问题是,当我从另一个类中的my方法返回内存流时,"canread"变量设置为false,从而导致streamreader初始化失败.
下面是一个问题发生的例子(虽然在这里我写的是另一个类中的内存流,但是当我传回它时仍然会导致相同的错误.
在名为"Otherclass"的类中:
public static MemoryStream ImportantStreamManipulator()
{
MemoryStream MemStream = new MemoryStream();
StreamWriter writer = new StreamWriter(MemStream);
using (writer)
{
//Code that writes stuff to the memorystream via streamwriter
return MemStream;
}
}
Run Code Online (Sandbox Code Playgroud)
函数调用主程序:
MemoryStream MStream = Otherclass.ImportantStreamManipulator();
StreamReader reader = new StreamReader(MStream);
Run Code Online (Sandbox Code Playgroud)
当我在"返回MemStream"上放置一个断点时,"CanRead"属性仍然设置为true.一旦我执行它返回到我的main函数,并将返回的值写入MStream,"CanRead"属性设置为false.然后,这会在StreamReader中导致异常,表示无法读取MStream(如指示的属性).数据应该在流缓冲区中,但我无法理解它.
如何设置它以便"CanRead"在返回主体后报告为真?或者我误解了MemoryStream的工作方式以及如何完成我想做的事情?
我有以下方法,将a转换BitmapImage为System.Drawing.Bitmap:
public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
Bitmap bitmap;
using (var ms = new MemoryStream())
{
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
encoder.Save(ms);
bitmap = new Bitmap(ms);
}
return bitmap;
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试使用返回的Bitmap对象时,我都会收到以下错误:
发生OutOfMemoryException - 内存不足.
但是,每当我用这个替换代码时:
public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
var ms = new MemoryStream();
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
encoder.Save(ms);
return new Bitmap(ms);
}
Run Code Online (Sandbox Code Playgroud)
这很好用.不过,我敢肯定,我应该用用作为MemoryStream对象实现IDisposable.这里发生了什么?
我想在MemoryStream中打开一个XML文件(来自zip存档),并在此流中创建一个StreamReader,将其放入GridView中.
我用这个代码:
MemoryStream ms = new MemoryStream();
entry.Extract(ms);
StreamReader reader = new StreamReader(ms);
DataSet ds = new DataSet();
ds.ReadXml(reader);
dataGridView1.DataSource = GlobalDs.Tables[0];
Run Code Online (Sandbox Code Playgroud)
如果我的XML文件是用ANSI编码的,那么它可以很好地工作.但是当我加载以UTF8编码的文件时,它会失败,即使我初始化StreamReader如下:
StreamReader reader = new StreamReader(ms, System.Text.Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)
我希望有人有想法解决我的问题.
我的问题是,一旦ZipArchive处理完毕,它就会自动关闭并处理掉MemoryStream.如果我在处理ZipArchive信息之前看一下流不完整的拉链.
using (var compressStream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(compressStream, ZipArchiveMode.Create))
{
// Adding a couple of entries
string navStackInfo = Navigation.NavState.CurrentStackInfoLines();
var navStackEntry = zipArchive.CreateEntry("NavStack.txt", CompressionLevel.NoCompression);
using (StreamWriter writer = new StreamWriter(navStackEntry.Open()))
{
writer.Write(navStackInfo);
}
var debugInfoEntry = zipArchive.CreateEntry("CallStack.txt", CompressionLevel.Optimal);
using (StreamWriter writer = new StreamWriter(debugInfoEntry.Open()))
{
// debugInfo.Details is a string too
writer.Write(debugInfo.Details);
}
// ...
// compressStream here is not well formed
}
// compressStream here is …Run Code Online (Sandbox Code Playgroud) 我遇到了将数据从a复制MemoryStream到Stream内部的问题ZipArchive.以下不起作用 - 它只返回114个字节:
GetDataAsByteArray(IDataSource dataSource)
{
using (var zipStream = new MemoryStream())
{
using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
{
var file = archive.CreateEntry("compressed.file");
using (var targetStream = file.Open())
{
using (var sourceStream = new MemoryStream())
{
await dataSource.LoadIntoStream(sourceStream);
sourceStream.CopyTo(targetStream);
}
}
}
var result = zipStream.ToArray();
zipStream.Close();
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,使用下面的实现"copy"-process,所有1103个字节都写入数组/内存流:
await targetStream.WriteAsync(sourceStream.ToArray(), 0, (int) sourceStream.Length);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么CopyTo产量减去字节数.另外,我Int32对第二个实现中的强制转换感到不安全.
仅供参考:比较字节数组:看起来只有zip文件的页眉和页脚是由第一个实现编写的.
哪一个更好:MemoryStream.WriteTo(Stream destinationStream)或者Stream.CopyTo(Stream destinationStream)??
我正在谈论没有Buffer的这两种方法的比较,因为我这样做:
Stream str = File.Open("SomeFile.file");
MemoryStream mstr = new MemoryStream(File.ReadAllBytes("SomeFile.file"));
using(var Ms = File.Create("NewFile.file", 8 * 1024))
{
str.CopyTo(Ms) or mstr.WriteTo(Ms);// Which one will be better??
}
Run Code Online (Sandbox Code Playgroud)
这是我想要做的:
我写了一些实际工作正常的代码.
但是现在我正在优化代码以提高效率.
我正在使用XmlWriter创建一个文件,XmlWriter writer = XmlWriter.Create(fileName);它正在创建一个文件然后我还有一个我正在调用的函数, private void EncryptFile(string inputFile, string outputFile)它需要2个字符串输入和outpulfile,最后我有两个文件,一个是加密的,一个不是.我只想要一个加密文件,但是我的加密函数需要输入由XmlWriter创建的inputfile.有没有什么办法可以创建内存流并将其传递给我的函数而不是创建一个输入文件.我的加密功能
private void EncryptFile (string inputFile, string outputFile)
string password = @"fdds"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
string cryptFile = outputFile;
FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,RMCrypto.CreateEncryptor(key,key),CryptoStreamMode.Write);
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
cs.WriteByte((byte)data);
cs.FlushFinalBlock();
fsIn.Close();
cs.Close();
fsCrypt.Close();
}
}
Run Code Online (Sandbox Code Playgroud) 我有这样的方法:
public DataObject GetClipboardData()
{
var result = new DataObject();
result.SetText(this.fallbackText.ToString());
result.SetData(DataFormats.Html, this.GenerateHtml(), false);
return result;
}
Run Code Online (Sandbox Code Playgroud)
哪里GenerateHtml返回一个MemoryStream.
我是否需要担心关闭MemoryStream物体?或者我应该使用其他类型的对象将原始字节放在剪贴板上?
(我试过,byte[]但这会将文字"System.Byte[]"或类似文字放在剪贴板上)
有没有办法将System.Drawing.Image附加到电子邮件而不保存它,然后从保存的路径中抓取它.
现在我正在创建图像并保存它.然后我发送电子邮件:
MailMessage mail = new MailMessage();
string _body = "body"
mail.Body = _body;
string _attacmentPath;
if (iP.Contains(":"))
_attacmentPath = (@"path1");//, System.Net.Mime.MediaTypeNames.Application.Octet));
else
_attacmentPath = @"path2");
mail.Attachments.Add(new Attachment(_attacmentPath, System.Net.Mime.MediaTypeNames.Application.Octet));
mail.To.Add(_imageInfo.VendorEmail);
mail.Subject = "Rouses' PO # " + _imageInfo.PONumber.Trim();
mail.From = _imageInfo.VendorNum == 691 ? new MailAddress("email", "") : new MailAddress("email", "");
SmtpClient server = null;
mail.IsBodyHtml = true;
mail.Priority = MailPriority.Normal;
server = new SmtpClient("server");
try
{
server.Send(mail);
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)
无论如何直接将System.Drawing.Image传递给mail.Attachments.Add()?
c# ×10
memorystream ×10
stream ×3
.net ×2
clipboard ×1
email ×1
image ×1
pdf ×1
streaming ×1
streamreader ×1
using ×1
wpf ×1
xmlwriter ×1
zip ×1
ziparchive ×1