.net 核心解压缩文件和 zip 子文件夹
.net core unzip a file and zip subfolder
我有一个 zip 文件的 byte[]。我需要将文件解压缩到内存中并在 zip 文件中找到 "dist" 文件夹(总会有一个 dist 文件夹)并使用 "dist" 文件夹中的任何内容创建一个新的 zip 文件。
"dist" 文件夹中可以有文件和子文件夹。我需要 byte[] 中的新 zip 文件,因此只能在内存中操作,无法访问物理磁盘。
我尝试使用 "SharpZipLib" 没有运气。
我正在使用 .net 核心 2.0
请尝试以下代码
using (MemoryStream srcMemoryStream = new MemoryStream())
{
using (MemoryStream targetMemoryStream = new MemoryStream())
{
// to have a byte array, I just read a file and store it into a memory stream
using (FileStream sourceZipFile = new FileStream(@"f:\source-file.zip", FileMode.Open))
{
sourceZipFile.CopyTo(srcMemoryStream);
}
using (ZipArchive srcArchive = new ZipArchive(srcMemoryStream, ZipArchiveMode.Read))
{
using (ZipArchive destArchive = new ZipArchive(targetMemoryStream, ZipArchiveMode.Create, true))
{
srcArchive.Entries
.Where(entry => entry.FullName.Contains("dist/"))
.ToList()
.ForEach((entry) =>
{
// i simply create the same folder with the same structure in other archive
// if you want to change the structure, you have to rename or remove parts of
// the path like below
/// var newEntryName = entry.FullName.Replace("files/dist/", "new-dist/");
/// ZipArchiveEntry newEntry = destArchive.CreateEntry(newEntryName);
ZipArchiveEntry newEntry = destArchive.CreateEntry(entry.FullName);
using (Stream srcEntry = entry.Open())
{
using (Stream destEntry = newEntry.Open())
{
srcEntry.CopyTo(destEntry);
}
}
});
}
}
// i just write the zip file on disk to make sure that it works, your desire state is already achieved
// before this line of code, and the result byte Array is inside the targetMemoryStream memory stream
using (FileStream fs = new FileStream(@"f:/destination-file.zip", FileMode.Create))
{
targetMemoryStream.WriteTo(fs);
targetMemoryStream.Flush();
fs.Flush(true);
}
}
}
您可以将这些字节数组存储在内存流中,我只是读取一个文件并将其存储到内存流中,但您可以简单地使用以下代码:
MemoryStream srcMemoryStream = new MemoryStream();
srcMemoryStream.Write(byteArray, 0, byteArray.Length);
我有一个 zip 文件的 byte[]。我需要将文件解压缩到内存中并在 zip 文件中找到 "dist" 文件夹(总会有一个 dist 文件夹)并使用 "dist" 文件夹中的任何内容创建一个新的 zip 文件。
"dist" 文件夹中可以有文件和子文件夹。我需要 byte[] 中的新 zip 文件,因此只能在内存中操作,无法访问物理磁盘。
我尝试使用 "SharpZipLib" 没有运气。 我正在使用 .net 核心 2.0
请尝试以下代码
using (MemoryStream srcMemoryStream = new MemoryStream())
{
using (MemoryStream targetMemoryStream = new MemoryStream())
{
// to have a byte array, I just read a file and store it into a memory stream
using (FileStream sourceZipFile = new FileStream(@"f:\source-file.zip", FileMode.Open))
{
sourceZipFile.CopyTo(srcMemoryStream);
}
using (ZipArchive srcArchive = new ZipArchive(srcMemoryStream, ZipArchiveMode.Read))
{
using (ZipArchive destArchive = new ZipArchive(targetMemoryStream, ZipArchiveMode.Create, true))
{
srcArchive.Entries
.Where(entry => entry.FullName.Contains("dist/"))
.ToList()
.ForEach((entry) =>
{
// i simply create the same folder with the same structure in other archive
// if you want to change the structure, you have to rename or remove parts of
// the path like below
/// var newEntryName = entry.FullName.Replace("files/dist/", "new-dist/");
/// ZipArchiveEntry newEntry = destArchive.CreateEntry(newEntryName);
ZipArchiveEntry newEntry = destArchive.CreateEntry(entry.FullName);
using (Stream srcEntry = entry.Open())
{
using (Stream destEntry = newEntry.Open())
{
srcEntry.CopyTo(destEntry);
}
}
});
}
}
// i just write the zip file on disk to make sure that it works, your desire state is already achieved
// before this line of code, and the result byte Array is inside the targetMemoryStream memory stream
using (FileStream fs = new FileStream(@"f:/destination-file.zip", FileMode.Create))
{
targetMemoryStream.WriteTo(fs);
targetMemoryStream.Flush();
fs.Flush(true);
}
}
}
您可以将这些字节数组存储在内存流中,我只是读取一个文件并将其存储到内存流中,但您可以简单地使用以下代码:
MemoryStream srcMemoryStream = new MemoryStream();
srcMemoryStream.Write(byteArray, 0, byteArray.Length);