我有一个可以处理 PDF 文件的第三方组件。每当我需要执行操作时,我都会从文档存储(数据库、SharePoint、文件系统等)检索 PDF 文档。为了使事情保持一致,我将 PDF 文档作为byte[].
这个第三方组件需要一个MemoryStream[](MemoryStream数组)作为我需要使用的主要方法之一的参数。
我正在尝试将此功能包装在我自己的组件中,以便我可以在应用程序中的多个区域中使用此功能。我基本上想出了以下内容:
public class PdfDocumentManipulator : IDisposable
{
List<MemoryStream> pdfDocumentStreams = new List<MemoryStream>();
public void AddFileToManipulate(byte[] pdfDocument)
{
using (MemoryStream stream = new MemoryStream(pdfDocument))
{
pdfDocumentStreams.Add(stream);
}
}
public byte[] ManipulatePdfDocuments()
{
byte[] outputBytes = null;
using (MemoryStream outputStream = new MemoryStream())
{
ThirdPartyComponent component = new ThirdPartyComponent();
component.Manipuate(this.pdfDocumentStreams.ToArray(), outputStream);
//move to begining
outputStream.Seek(0, SeekOrigin.Begin);
//convert the memory stream to a byte array
outputBytes = outputStream.ToArray();
} …Run Code Online (Sandbox Code Playgroud) Tyring 压缩和解压缩,MemoryStream但似乎CopyTo不像预期的那样工作?为什么?如何解决这个问题?
public static MemoryStream Compress(MemoryStream originalStream)
{
Console.WriteLine("Original before compressing size: {0}", originalStream.Length.ToString());
MemoryStream compressedMemoryStream = new MemoryStream();
using (DeflateStream deflateStream = new DeflateStream(compressedMemoryStream, CompressionMode.Compress, true))
{
originalStream.CopyTo(deflateStream);
}
Console.WriteLine("Compressed size: {0}", compressedMemoryStream.Length.ToString());
return compressedMemoryStream;
}
public static void Decompress(MemoryStream compressedStream)
{
Console.WriteLine("Compressed before decompressing size: {0}", compressedStream.Length.ToString());
using (MemoryStream decompressedFileStream = new MemoryStream())
{
using (DeflateStream decompressionStream = new DeflateStream(compressedStream, CompressionMode.Decompress, true))
{
decompressionStream.CopyTo(decompressedFileStream);
}
Console.WriteLine("Decompressed size: {0}", decompressedFileStream.Length.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Original before …Run Code Online (Sandbox Code Playgroud) 我正在尝试在内存中创建一个 Zip 文件,将其他一些文件添加为存档条目,并使用以下命令从我的 Web API 控制器返回它:
try {
// Create Zip Archive in Memory
MemoryStream memoryStream = new MemoryStream();
ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create);
foreach(Worksheet w in worksheets) {
string fullPath = Path.Combine(baseFolder, w.FilePathAndName);
if(System.IO.File.Exists(fullPath)) {
ZipArchiveEntry f = zipArchive.CreateEntry(w.FileName, CompressionLevel.Fastest);
using(Stream entryStream = f.Open()) {
FileStream fileStream = System.IO.File.OpenRead(fullPath);
await fileStream.CopyToAsync(entryStream);
}
}
}
memoryStream.Seek(0, SeekOrigin.Begin);
return File(memoryStream, "application/zip", $"Files.zip");
} catch(Exception e) {
return StatusCode(500, "Error: Could not generate zip file");
}
Run Code Online (Sandbox Code Playgroud)
这会创建并返回一个 zip 文件,但是它是无效的。7-Zip 给了我这个错误 …
嘿伙计们,我最近遇到了这个网页http://www.yoda.arachsys.com/csharp/readbinary.html,解释了从文件流中读取时要采取的预防措施.它的要点是以下代码并不总是有效:
// Bad code! Do not use!
FileStream fs = File.OpenRead(filename);
byte[] data = new byte[fs.Length];
fs.Read (data, 0, data.Length);
Run Code Online (Sandbox Code Playgroud)
这很危险,因为Read的第三个参数是要读取的最大字节数,您应该使用Read的返回值来检查实际读取的数量.
我的问题是,在从内存流中读取时应该采取相同的预防措施,在读取所有字节之前,在什么情况下Read可以返回?
谢谢,巴斯
我正在构建一个允许用户从URL下载文件的库.我正在考虑的一个选项是让用户为文件指定预期的MD5校验和; 库的GetFile(string url)函数确保下载的流的校验和与用户指定的校验和匹配.
知道HttpWebResponse.GetResponseStream()返回的NetworkStream是不可寻的,我找到了一种复制流的方法,这要归功于这个问题的答案:如何在C#中读取两次Http响应流?.在我走得更远之前,我想弄清楚这种重复的记忆含义是什么; 不幸的是,Google和MSDN上的多次搜索都化为乌有.
该库对要下载的文件的大小没有限制.我的问题是,如果用户选择2GB文件,.NET 2.0中的MemoryStream实现是否足够智能,足以有效地使用PageFile和RAM,系统不会因VM崩溃而开始爬行?此外,Jon Skeet对另一个问题的评论给了我一些思考 - 他断言即使在处理了MemoryStream后,内存也不是100%免费的.我如何以及何时确保实际释放内存?它会根据系统的要求(和必要性)发布吗?
谢谢,Manoj
如何使用内存流创建文件并写入文件?我需要使用memorystream来防止其他线程尝试访问该文件.
我试图保存到文件的数据是html.
如何才能做到这一点?
工作:
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFile)))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
}
}
Run Code Online (Sandbox Code Playgroud)
不工作,记忆流
using (ZipInputStream s = new ZipInputStream(memorystream))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)//Exception **EOF in header**
{
}
}
Run Code Online (Sandbox Code Playgroud)
如何转换?
我想创建一个包含int32,int16,单值的内存流.使用二进制文件是没用的,所以我试图创建字节数组.因为值是不同的类型,我不知道如何正确地做到这一点.所以我尝试这样做:
byte[] tab = new byte[]{2,0,0,0,3,0,3,0} - 2是int32(四个字节),另外两个是int16(两个字节)
工作正常,但是当我想添加一些单个值时,它会产生错误.我不能这样做:
byte[] tab = new byte[]{2,0,0,0,3,0,3,0,4.4f,5.6f}
我必须有正确格式的流,因为这个流将在这个方法中读取:
short[] rawData;
float[] modulusData;
public void rawData(Stream s)
{
BinaryReader br = new BinaryReader(s);
int dataCount = br.ReadInt32();
if (dataCount > 0)
{
rawData = new short[dataCount];
for (int i = 0; i < dataCount; i++)
rawData[i] = br.ReadInt16();
}
else
rawData = new short[0];
dataCount = br.ReadInt32();
if (dataCount > 0)
{
modulusData = new float[dataCount];
for (int i = 0; i < dataCount; …Run Code Online (Sandbox Code Playgroud) 我已经验证使用System.Text.Encoding.ASCII.GetString(ms.ToArray));了我的内存流有预期的数据.
但是,使用LinqToCSV nuget库不会生成我的csv文件.我没有抛出任何错误或异常.当我提示打开文件时,我只得到一个空文件.
这是我的行动方法
public FileStreamResult Export(){
var results = _service.GetProperties().Take(3);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.TextWriter txt = new System.IO.StreamWriter(ms);
CsvFileDescription inputFileDescription = new CsvFileDescription{
SeparatorChar =',',
FirstLineHasColumnNames = true
}
;
CsvContext csv = new CsvContext();
csv.Write(results,txt,inputFileDescription);
return File(ms , "application/x-excel");
}
Run Code Online (Sandbox Code Playgroud)
我觉得有趣的是,如果我将返回类型更改为contentResult,并将返回方法更改为Content()并传递它,System.Text.Encoding.ASCII.GetString(ms.ToArray));我会得到一个显示我的数据的浏览器窗口.
我有一个方法,我发送文件作为附件.我使用StreamWriter和MemoryStream创建附件.代码如下:
public void ComposeEmail(string from, string to, SmtpClient client)
{
MailMessage mm = new MailMessage(from, to, "Otrzyma?e? nowe zamówienie od "+from , "Przesy?am nowe zamówienie na sprz?t");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
// Adding attachment:
using (var ms = new System.IO.MemoryStream())
{
using (var writer = new System.IO.StreamWriter(ms))
{
writer.Write("Hello its my sample file");
writer.Flush();
System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Text.Plain);
System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, ct);
attach.ContentDisposition.FileName = "myFile.txt";
mm.Attachments.Add(attach);
try
{
client.Send(mm);
}
catch …Run Code Online (Sandbox Code Playgroud) memorystream ×10
c# ×8
.net ×1
.net-core ×1
attachment ×1
byte ×1
deflate ×1
dispose ×1
email ×1
filestream ×1
idisposable ×1
linq ×1
streamwriter ×1
zipfile ×1