refactor(pep-lib): replace DotNetZip with System.IO.Compression and refactor readers

- Remove DotNetZip package from PepLib.Core.csproj
- Update DrawingReader, NestReader, and ZipHelper to use System.IO.Compression.ZipArchive
- Simplify stream handling and improve resource disposal
- Keep behavior consistent for loop/plate detection and extraction
This commit is contained in:
2025-10-29 11:03:56 -04:00
parent 2f56a542a8
commit 61866df17e
4 changed files with 77 additions and 140 deletions

View File

@@ -1,7 +1,7 @@
using Ionic.Zip;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace PepLib.IO namespace PepLib.IO
@@ -22,48 +22,32 @@ namespace PepLib.IO
public void Read(Stream stream) public void Read(Stream stream)
{ {
var zipStream = new ZipInputStream(stream); using (var zip = new ZipArchive(stream, ZipArchiveMode.Read, leaveOpen: true))
ZipEntry theEntry;
while ((theEntry = zipStream.GetNextEntry()) != null)
{ {
var size = 2048; foreach (var entry in zip.Entries)
var data = new byte[size];
var memstream = new MemoryStream();
while (true)
{ {
size = zipStream.Read(data, 0, data.Length); using var entryStream = entry.Open();
var memstream = new MemoryStream();
entryStream.CopyTo(memstream);
memstream.Seek(0, SeekOrigin.Begin);
if (size > 0) var extension = Path.GetExtension(entry.FullName);
switch (extension)
{ {
memstream.Write(data, 0, size); case ".dir":
memstream.Flush(); LoadInfo(memstream);
memstream.Close();
continue;
} }
else break;
if (Regex.IsMatch(extension, "loop-\\d\\d\\d"))
Drawing.Loops.Add(ReadLoop(entry.FullName, memstream));
memstream.Close();
} }
memstream.Seek(0, SeekOrigin.Begin);
var extension = Path.GetExtension(theEntry.FileName);
switch (extension)
{
case ".dir":
LoadInfo(memstream);
memstream.Close();
continue;
}
if (Regex.IsMatch(extension, "loop-\\d\\d\\d"))
Drawing.Loops.Add(ReadLoop(theEntry.FileName, memstream));
memstream.Close();
} }
zipStream.Close();
Drawing.ResolveLoops(); Drawing.ResolveLoops();
} }
@@ -111,3 +95,4 @@ namespace PepLib.IO
} }
} }
} }

View File

@@ -1,8 +1,8 @@
using Ionic.Zip;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@@ -32,57 +32,41 @@ namespace PepLib.IO
const string plateExtensionPattern = "plate-\\d\\d\\d"; const string plateExtensionPattern = "plate-\\d\\d\\d";
const string loopExtensionPattern = "loop-\\d\\d\\d"; const string loopExtensionPattern = "loop-\\d\\d\\d";
var zipStream = new ZipInputStream(stream); using (var zip = new ZipArchive(stream, ZipArchiveMode.Read, leaveOpen: true))
ZipEntry theEntry;
while ((theEntry = zipStream.GetNextEntry()) != null)
{ {
var size = 2048; foreach (var entry in zip.Entries)
var data = new byte[size];
var memstream = new MemoryStream();
while (true)
{ {
size = zipStream.Read(data, 0, data.Length); using var entryStream = entry.Open();
var memstream = new MemoryStream();
entryStream.CopyTo(memstream);
memstream.Seek(0, SeekOrigin.Begin);
if (size > 0) var extension = Path.GetExtension(entry.FullName);
switch (extension)
{ {
memstream.Write(data, 0, size); case ".report":
memstream.Flush(); LoadReport(memstream);
memstream.Close();
continue;
case ".dwg-info":
LoadDrawingInfo(memstream);
memstream.Close();
continue;
default:
Debug.WriteLine("Unknown file: " + entry.FullName);
break;
} }
else break;
if (Regex.IsMatch(extension, loopExtensionPattern))
loops.Add(entry.FullName, memstream);
else if (Regex.IsMatch(extension, plateExtensionPattern))
plates.Add(entry.FullName, memstream);
} }
memstream.Seek(0, SeekOrigin.Begin);
var extension = Path.GetExtension(theEntry.FileName);
switch (extension)
{
case ".report":
LoadReport(memstream);
memstream.Close();
continue;
case ".dwg-info":
LoadDrawingInfo(memstream);
memstream.Close();
continue;
default:
Debug.WriteLine("Unknown file: " + theEntry.FileName);
break;
}
if (Regex.IsMatch(extension, loopExtensionPattern))
loops.Add(theEntry.FileName, memstream);
else if (Regex.IsMatch(extension, plateExtensionPattern))
plates.Add(theEntry.FileName, memstream);
} }
zipStream.Close();
foreach (var loop in loops) foreach (var loop in loops)
Nest.Loops.Add(ReadLoop(loop.Key, loop.Value)); Nest.Loops.Add(ReadLoop(loop.Key, loop.Value));
@@ -163,3 +147,4 @@ namespace PepLib.IO
} }
} }
} }

View File

@@ -7,7 +7,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DotNetZip" Version="1.16.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.10"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.10">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

View File

@@ -1,6 +1,6 @@
using Ionic.Zip;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace PepLib namespace PepLib
@@ -17,42 +17,27 @@ namespace PepLib
/// <returns></returns> /// <returns></returns>
public static int ExtractByPattern(string file, string pattern, out string[] names, out Stream[] streams) public static int ExtractByPattern(string file, string pattern, out string[] names, out Stream[] streams)
{ {
var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
var zipStream = new ZipInputStream(fileStream);
var nameList = new List<string>(); var nameList = new List<string>();
var streamList = new List<Stream>(); var streamList = new List<Stream>();
ZipEntry theEntry; using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
using (var zip = new ZipArchive(fileStream, ZipArchiveMode.Read))
while ((theEntry = zipStream.GetNextEntry()) != null)
{ {
if (!Regex.IsMatch(theEntry.FileName, pattern)) foreach (var entry in zip.Entries)
continue;
nameList.Add(theEntry.FileName);
var memstream = new MemoryStream();
var size = 2048;
var data = new byte[size];
while (true)
{ {
size = zipStream.Read(data, 0, data.Length); if (!Regex.IsMatch(entry.FullName, pattern))
continue;
if (size > 0) nameList.Add(entry.FullName);
{
memstream.Write(data, 0, size); var memstream = new MemoryStream();
memstream.Flush(); using var entryStream = entry.Open();
} entryStream.CopyTo(memstream);
else break; memstream.Seek(0, SeekOrigin.Begin);
streamList.Add(memstream);
} }
memstream.Seek(0, SeekOrigin.Begin);
streamList.Add(memstream);
} }
zipStream.Close();
names = nameList.ToArray(); names = nameList.ToArray();
streams = streamList.ToArray(); streams = streamList.ToArray();
@@ -69,44 +54,26 @@ namespace PepLib
/// <returns></returns> /// <returns></returns>
public static bool ExtractByExtension(string file, string extension, out string name, out Stream stream) public static bool ExtractByExtension(string file, string extension, out string name, out Stream stream)
{ {
var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read); using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
var zipStream = new ZipInputStream(fileStream); using (var zip = new ZipArchive(fileStream, ZipArchiveMode.Read))
var memstream = new MemoryStream();
ZipEntry theEntry;
while ((theEntry = zipStream.GetNextEntry()) != null)
{ {
if (Path.GetExtension(theEntry.FileName) != extension) foreach (var entry in zip.Entries)
continue;
int size = 2048;
var data = new byte[size];
while (true)
{ {
size = zipStream.Read(data, 0, data.Length); if (Path.GetExtension(entry.FullName) != extension)
continue;
if (size > 0) var memstream = new MemoryStream();
{ using var entryStream = entry.Open();
memstream.Write(data, 0, size); entryStream.CopyTo(memstream);
memstream.Flush(); memstream.Seek(0, SeekOrigin.Begin);
}
else break; stream = memstream;
name = entry.FullName;
return true;
} }
zipStream.Close();
memstream.Seek(0, SeekOrigin.Begin);
stream = memstream;
name = theEntry.FileName;
return true;
} }
zipStream.Close();
memstream.Close();
stream = null; stream = null;
name = null; name = null;
@@ -114,3 +81,4 @@ namespace PepLib
} }
} }
} }