我注意到有两种不同的方法可以将数据写入XML文件(为简洁起见,省略了错误处理).
第一种方法是构建XML文档,然后将XML保存到文件中:
using (XmlWriter writer = XmlWriter.Create(fileName))
{
writer.WriteStartDocument(true);
writer.WriteStartElement("parentelement");
writer.WriteEndElement();
writer.WriteEndDocument();
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是创建MemoryStream,然后将MemoryStream保存到文件中:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
MemoryStream ms = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
writer.WriteStartDocument(true);
writer.WriteStartElement("parentelement");
writer.WriteEndElement();
writer.WriteEndDocument();
}
using (FileStream fs = File.Open(fileName, FileMode.Create, FileAccess.Write))
{
ms.WriteTo(fs);
ms.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
我猜测使用MemoryStream的逻辑是确保在尝试保存文件之前可以构建XML文件.在将条目添加到XML文件中时,MemoryStream方法是否会提供Atomic写入事件和/或防止写入问题?
任何人都可以解释这是否真的有必要或只是一种过度杀戮的方式来添加不必要的代码行到我的项目?
我想在我的C#应用程序中嵌入一个命令行实用程序,这样我就可以将其字节作为数组获取并运行可执行文件而无需将其作为单独的文件保存到磁盘(避免将可执行文件存储为单独的文件并避免需要能力在任何地方写临时文件).
我找不到一个只从其字节流运行可执行文件的方法.Windows是否要求它在磁盘上,还是有办法从内存中运行它?如果windows要求它在磁盘上,那么.NET框架中是否有一种简单的方法来创建某种虚拟驱动器/文件并将文件映射到可执行文件的内存流?
我正在尝试使用iTextSharp创建一个pdf文件.我的尝试将pdf的内容写入MemoryStream,因此我可以将结果写入文件和数据库BLOB.创建文件,大小约为21kB,当使用Notepad ++打开时,它看起来像一个pdf.但是我的PDF查看器说它已经被破坏了.这是一个小代码片段(只尝试写入文件,而不是数据库):
Document myDocument = new Document();
MemoryStream myMemoryStream = new MemoryStream();
PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream);
myDocument.Open();
// Content of the pdf gets inserted here
using (FileStream fs = File.Create("D:\\...\\aTestFile.pdf"))
{
myMemoryStream.WriteTo(fs);
}
myMemoryStream.Close();
Run Code Online (Sandbox Code Playgroud)
我犯的错误在哪里?
谢谢你,诺伯特
使用的优点或缺点(或差异)是什么
memoryStream.Seek(0, SeekOrigin.Begin);
代替
memoryStream.Position = 0
我有一个来自OpenXML的MemoryStream的问题.我成功打开一个Word文件,更改它并通过HttpResponse下载它,如果我在一个方法中执行所有步骤.
但是如果我尝试通过返回MemoryStream在两个不同的类(或方法)中执行它,我会得到一个损坏的word文件.我想到了冲洗或缓冲问题,但我没有找到解决方案.
这是工作代码:
public void FillTemplateOpenXmlWord(HttpResponse response)
{
string filePath = @"c:\template.docx";
byte[] filebytes = File.ReadAllBytes(filePath);
using (MemoryStream stream = new MemoryStream(filebytes))
{
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(stream, true))
{
// do some changes
...
myDoc.MainDocumentPart.Document.Save();
}
string docx = "docx";
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.AddHeader("content-disposition", "attachment; filename=\"" + docx + ".docx\"");
response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
stream.Position = 0;
stream.CopyTo(response.OutputStream);
response.End();
}
}
Run Code Online (Sandbox Code Playgroud)
这是非工作代码:
public void OpenFile(HttpResponse response)
{
MemoryStream stream = this.FillTemplateOpenXmlWord();
string docx = "docx";
response.Clear();
response.ClearHeaders(); …Run Code Online (Sandbox Code Playgroud) 我正在编写ac#例程,从jpg文件创建哈希.如果我将一个字节数组传递给我的SHA512对象然后我得到了预期的行为,但是,如果我传入一个内存流,这两个文件总是散列到相同的值.
例1:
SHA512 mySHA512 = SHA512.Create();
Image img1 = Image.FromFile(@"d:\img1.jpg");
Image img2 = Image.FromFile(@"d:\img2.jpg");
MemoryStream ms1 = new MemoryStream();
MemoryStream ms2 = new MemoryStream();
img1.Save(ms1, ImageFormat.Jpeg);
byte[] buf1 = ms1.GetBuffer();
byte[] hash1 = mySHA512.ComputeHash(buf1);
img2.Save(ms2, ImageFormat.Jpeg);
byte[] buf2 = ms2.GetBuffer();
byte[] hash2 = mySHA512.ComputeHash(buf2);
if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
MessageBox.Show("Hashed the same");
else
MessageBox.Show("Different hashes");
Run Code Online (Sandbox Code Playgroud)
这会产生"不同的哈希".但ComputeHash方法的一个重载需要一个流对象,我宁愿使用它.当我做:
SHA512 mySHA512 = SHA512.Create();
Image img1 = Image.FromFile(@"d:\img1.jpg");
Image img2 = Image.FromFile(@"d:\img2.jpg");
MemoryStream ms1 = new MemoryStream();
MemoryStream ms2 = new MemoryStream();
img1.Save(ms1, ImageFormat.Jpeg);
byte[] …Run Code Online (Sandbox Code Playgroud) 我把文件从内存流上传到数据库时遇到了一些麻烦(它在DB中可见为0x,所以我猜它没有得到妥善保存).我不确定是否存在创建Stream或从流中保存到db的问题应该以不同方式完成.
private void test {
byte[] storage = new byte[500000];
using (MemoryStream stream = new MemoryStream(storage))
DocX documentWord = DocX.Create(stream);
// some stuff
documentWord.Save();
databaseFilePut(stream);
}
public static void databaseFilePut(MemoryStream stream) {
byte[] file;
using (var reader = new BinaryReader(stream)) {
file = reader.ReadBytes((int) stream.Length);
// reader.Close();
}
//stream.Close();
//}
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP))
using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
sqlWrite.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我正在使用Docx codeplex库.
我必须遵循被调用来改变图像分辨率的函数.我想这样做,所以上传的图像例如300dpi将被修改为72dpi(对于web).这个问题与我在哪里工作的另一个问题有关.
我创建了一个扩展方法,可以在我的应用程序中的更多位置使用此功能,而不是仅在上载新文件时.(见上述问题)
public static byte[] SetDpiTo72(this byte[] imageToFit, string mimeType, Size newSize)
{
using (MemoryStream memoryStream = new MemoryStream(), newMemoryStream = new MemoryStream())
{
memoryStream.Write(imageToFit, 0, imageToFit.Length);
var originalImage = new Bitmap(memoryStream);
using (var canvas = Graphics.FromImage(originalImage))
{
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage((Image)originalImage,0,0, newSize.Width, newSize.Height);
newBitmap.SetResolution(72, 72);
newBitmap.Save(newMemoryStream, ImageFunctions.GetEncoderInfo(mimeType), null);
}
return newMemoryStream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
提到的扩展方法在类似于下面情况的函数中被调用;
if (newSize.Width > originalImage.Width && newSize.Height > originalImage.Height)
{
newSize.Width = originalImage.Width;
newSize.Height = originalImage.Height;
uploadedFileBuffer = …Run Code Online (Sandbox Code Playgroud) 谁能告诉我们下面这段代码有什么问题?我们这里有一个对象序列化程序,它应该返回传递给它的任何对象的XML字符串.
我们一直在讨论这个问题,因为我们有一个多次调用这个程序的程序,我们看到我们的内存使用量一直很高(甚至在程序完成后仍然存在)...我们已经完成了搜索但是徒劳无功.stream对象在一个"using"语句中,所以我们认为这应该是自己处理的..请帮忙.
public static string ToXML(this IMessage m)
{
try
{
var serializer = SerializerFactory.Create(m.GetType());
using (var stream = new MemoryStream())
{
serializer.Serialize(new[] { m }, stream);
stream.Position = 0;
var s = Encoding.ASCII.GetString(stream.ToArray());
return s;
}
}
catch (Exception e)
{
return string.Format("Message unserializable: {0}", e.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
btw SerializerFactory看起来像这样:
public class SerializerFactory
{
public static IMessageSerializer Create(Type t)
{
var types = new List<Type> { t };
var mapper = new MessageMapper();
mapper.Initialize(types);
var serializer = new XmlMessageSerializer(mapper); …Run Code Online (Sandbox Code Playgroud) 我正在使用Indy(idHTTP)从Internet下载EXE文件,我可以使用memorystream或filestream将其保存到磁盘,但我真的不知道它们之间是否有任何区别(可能在文件的结果结构中? ).我找不到答案.
这里有两个简单的函数来模拟我在做什么:
Function DownloadMS(FUrl, Dest: String): Boolean;
var
Http: TIdHTTP;
Strm: TMemoryStream;
Begin
Result := False;
Http := TIdHTTP.Create;
Strm := TMemoryStream.Create;
With Http, Strm Do
Try
Try
Get(FUrl, Strm);
If (Size > 0) Then
Begin
Position := 0;
SaveToFile(Dest);
Result := True;
end;
Except
end;
Finally
Strm.Free;
Http.Free;
end;
end;
Function DownloadFS(FUrl, Dest: String): Boolean;
var
Http: TIdHTTP;
Strm: TFileStream;
Begin
Result := False;
Http := TIdHTTP.Create;
Strm := TFileStream.Create(Dest, fmCreate);
With Http, Strm Do
Try
Try
Get(FUrl, …Run Code Online (Sandbox Code Playgroud) memorystream ×10
c# ×7
.net ×2
filestream ×2
asp.net ×1
c#-3.0 ×1
delphi ×1
docx ×1
executable ×1
hash ×1
idhttp ×1
indy ×1
itextsharp ×1
memory-leaks ×1
ms-word ×1
openxml ×1
pdf ×1
sha512 ×1
stream ×1
unmanaged ×1
xml ×1