将压缩文件解压缩到内存流 - C#
我已经编写了将压缩文件的编码字符串存储到temp路径中的代码,现在我想将编码的zipfile字符串存储到内存流而不是临时路径。有人可以帮助我如何读取流并将其作为字符串传递给ZipFile类...我使用DOTNETZIP库来解压密码抗原文件。 请看下面我的代码。将压缩文件解压缩到内存流 - C#
string tempPath = Path.GetTempPath();
foreach (ActivityMimeAttachment a in attachments.Entities)
{
if (a.FileName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
{
string strcontent = a.Body;
byte[] filecontent = Convert.FromBase64String(strcontent); // unpack the base-64 to a blob
File.WriteAllBytes(tempPath + a.FileName, filecontent); // Working code creates a zip file
string attachmentfile = tempPath + a.FileName;
using (ZipFile zip = new ZipFile(attachmentfile))
{
foreach (ZipEntry entry in zip.Entries)
{
if ((entry.FileName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) ||
(entry.FileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)))
{
entry.ExtractWithPassword(tempPath, "password");
FileStream inFile;
byte[] binaryData;
string file = tempPath + entry.FileName;
inFile = new FileStream(file, FileMode.Open, FileAccess.Read);
binaryData = new Byte[inFile.Length];
long bytesRead = inFile.Read(binaryData, 0,
(int)inFile.Length);
inFile.Close();
你会想你的文件内容转换为内存流(Stream filestream = new MemoryStream(filecontent)
),然后使用ZipFile.Read(fileStream)
。然后使用StreamReader
以字符串形式获取内容。因此,尝试这样的事情(请注意这是未经测试):
string myString;
byte[] filecontent = Convert.FromBase64String(strcontent);
using (var filestream = new MemoryStream(filecontent))
{
using (ZipFile zip = ZipFile.Read(filestream))
{
foreach (ZipEntry entry in zip.Entries)
{
if ((entry.FileName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) ||
(entry.FileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)))
{
using (var ms = new MemoryStream())
{
entry.ExtractWithPassword(ms, "password");
ms.Position = 0;
var sr = new StreamReader(ms);
myString = sr.ReadToEnd();
}
...
如果结果应该是一个base64字符串,这样做:
entry.ExtractWithPassword(ms, "password");
ms.Position = 0;
myString = Convert.ToBase64String(ms.ToArray());
您可能会或可能不会有重置流的位置,但这是一个很好的做法。
现在,您可以将结果作为字符串使用,而无需先写入文件。
非常感谢 - 巴拉。正是我需要的和一个小问题,我存储数据的字符串不是Base 64所以我试图添加一条线..但是当我尝试打开PDF文件时,内存不足。 'var bytes = Encoding.UTF8.GetBytes(myString); string attachmentContent = Convert.ToBase64String(bytes);' – Kittu
不客气。如果你想把它作为base64,那么删除最后2行,并把'myString = Convert.ToBase64String(ms.ToArray())'。答案将会更新 – Balah
太棒了。它正在工作。我非常感谢你的帮助。 – Kittu
你不能只是将你的字节数组转换为内存流吗? Stream stream = new MemoryStream(filecontent); – k3davis
感谢您的回复。你是对的。我可以转换,但我的问题是如何从内存流中读取它并将其作为字符串传递给ZIP文件。 – Kittu