mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-21 05:53:33 -07:00
replaced our zip library so we can validate update package before applying.
This commit is contained in:
parent
8f0d3e2e3b
commit
635e206e03
11 changed files with 82 additions and 75 deletions
|
@ -1,23 +1,79 @@
|
|||
using System.Linq;
|
||||
using Ionic.Zip;
|
||||
using System;
|
||||
using System.IO;
|
||||
using ICSharpCode.SharpZipLib.Core;
|
||||
using ICSharpCode.SharpZipLib.Zip;
|
||||
using NLog;
|
||||
|
||||
namespace NzbDrone.Common
|
||||
{
|
||||
public class ArchiveProvider
|
||||
public interface IArchiveService
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
void Extract(string compressedFile, string destination);
|
||||
}
|
||||
|
||||
public virtual void ExtractArchive(string compressedFile, string destination)
|
||||
public class ArchiveService : IArchiveService
|
||||
{
|
||||
private readonly Logger _logger;
|
||||
|
||||
public ArchiveService(Logger logger)
|
||||
{
|
||||
logger.Trace("Extracting archive [{0}] to [{1}]", compressedFile, destination);
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
using (var zipFile = ZipFile.Read(compressedFile))
|
||||
public void Extract(string compressedFile, string destination)
|
||||
{
|
||||
_logger.Trace("Extracting archive [{0}] to [{1}]", compressedFile, destination);
|
||||
|
||||
using (var fileStream = File.OpenRead(compressedFile))
|
||||
{
|
||||
zipFile.ExtractAll(destination);
|
||||
var zipFile = new ZipFile(fileStream);
|
||||
|
||||
_logger.Debug("Validating Archive {0}", compressedFile);
|
||||
|
||||
if (!zipFile.TestArchive(true, TestStrategy.FindFirstError, OnZipError))
|
||||
{
|
||||
throw new IOException(string.Format("File {0} failed archive validation.", compressedFile));
|
||||
}
|
||||
|
||||
foreach (ZipEntry zipEntry in zipFile)
|
||||
{
|
||||
if (!zipEntry.IsFile)
|
||||
{
|
||||
continue; // Ignore directories
|
||||
}
|
||||
String entryFileName = zipEntry.Name;
|
||||
// to remove the folder from the entry:- entryFileName = Path.GetFileName(entryFileName);
|
||||
// Optionally match entrynames against a selection list here to skip as desired.
|
||||
// The unpacked length is available in the zipEntry.Size property.
|
||||
|
||||
byte[] buffer = new byte[4096]; // 4K is optimum
|
||||
Stream zipStream = zipFile.GetInputStream(zipEntry);
|
||||
|
||||
// Manipulate the output filename here as desired.
|
||||
String fullZipToPath = Path.Combine(destination, entryFileName);
|
||||
string directoryName = Path.GetDirectoryName(fullZipToPath);
|
||||
if (directoryName.Length > 0)
|
||||
Directory.CreateDirectory(directoryName);
|
||||
|
||||
// Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size
|
||||
// of the file, but does not waste memory.
|
||||
// The "using" will close the stream even if an exception occurs.
|
||||
using (FileStream streamWriter = File.Create(fullZipToPath))
|
||||
{
|
||||
StreamUtils.Copy(zipStream, streamWriter, buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.Trace("Extraction complete.");
|
||||
_logger.Trace("Extraction complete.");
|
||||
}
|
||||
|
||||
private void OnZipError(TestStatus status, string message)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(message))
|
||||
{
|
||||
_logger.Error("File {0} failed zip validation. {1}", status.File.Name, message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue