gpt4 book ai didi

c# - DotNetZip - 读取到内存

转载 作者:行者123 更新时间:2023-11-30 22:40:18 25 4
gpt4 key购买 nike

我使用 DotNetZip 库进行了快速测试,该库打开一个充满 .bmp 文件的 zip 文件并将它们转换为 .jpg 格式。

在此之前,我将所有文件写入一个文件夹,转换它们,保存 jpg 文件,然后删除原始的 bmp 文件,这变得很乱。

我不想先将它们解压缩到内存中,然后转换为 jpg 然后保存。

代码有效,但速度不快。任何人都可以给我任何关于我可以做些什么来改进代码的指示吗?另外,线程会有帮助吗?

string zipToUnpack = "c:\\test\\1000.zip";
string unpackDirectory = "c:\\temp\\";

string f = string.Empty;
Bitmap bm;
MemoryStream ms;

using (ZipFile zip = ZipFile.Read(zipToUnpack))
{
foreach (ZipEntry e in zip)
{
if (e.FileName.ToLower().IndexOf(".bmp") > 0)
{
ms = new MemoryStream();
e.Extract(ms);
try
{
bm = new Bitmap(ms);
f = unpackDirectory + e.FileName.ToLower().Replace(".bmp", ".jpg");
bm.Save(f, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception ex)
{
Console.WriteLine("File: " + e.FileName + " " + ex.ToString());
}
ms.Dispose();
}
}
}

谢谢

最佳答案

一般来说,DotNetZip 是单线程的。您可以在多个线程中打开多个存档,但每个存档只能在一个线程中打开。

如果你想征用多个 CPU 或内核,那么我建议在将 MemoryStream 中的数据转换为 jpg 的部分调用 QueueUserWorkItem。

对所有条目的 ZipEntry.Extract() 调用需要在同一个线程上完成。这是因为 Zipfile 为所有读取访问维护单个 FileStream,并且多个线程提取条目会导致文件指针算术错误。

所以,像这样:

    public class State
{
public string FileName;
public MemoryStream stream;
}

public void Run()
{
string unpackDirectory = "c:\\temp\\";
string zipToUnpack = "c:\\test\\1000.zip";

var ConvertImage = new WaitCallback( (o) => {
State s = o as State;
try
{
var bm = new Bitmap(s.stream);
var f = unpackDirectory + s.FileName.ToLower().Replace(".bmp", ".jpg");
bm.Save(f, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception ex)
{
Console.WriteLine("File: " + s.FileName + " " + ex.ToString());
}
});


using (ZipFile zip = ZipFile.Read(zipToUnpack))
{
foreach (ZipEntry e in zip)
{
if (e.FileName.ToLower().IndexOf(".bmp") > 0)
{
var ms = new MemoryStream();
e.Extract(ms);
ThreadPool.QueueUserWorkItem ( ConvertImage,
new State {
FileName = e.FileName, stream = ms }
});
}
}
}
}

关于c# - DotNetZip - 读取到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com