6bdd276d05
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
105 lines
2.7 KiB
C#
105 lines
2.7 KiB
C#
// UnzipArchive.cs
|
|
//
|
|
// Copyright (c) 2008 [copyright holders]
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
// THE SOFTWARE.
|
|
//
|
|
//
|
|
|
|
using System;
|
|
using System.IO;
|
|
|
|
namespace zipsharp
|
|
{
|
|
class UnzipArchive : IDisposable
|
|
{
|
|
string[] files;
|
|
|
|
internal bool FileActive {
|
|
get; set;
|
|
}
|
|
|
|
string[] Files {
|
|
get {
|
|
if (files == null)
|
|
files = NativeVersion.Use32Bit ? NativeUnzip.GetFiles32 (Handle) : NativeUnzip.GetFiles64 (Handle);
|
|
return files;
|
|
}
|
|
}
|
|
|
|
internal UnzipHandle Handle {
|
|
get; private set;
|
|
}
|
|
|
|
ZipStream Stream {
|
|
get; set;
|
|
}
|
|
|
|
public UnzipArchive (string filename)
|
|
: this (File.Open (filename, FileMode.Open), true)
|
|
{
|
|
|
|
}
|
|
|
|
public UnzipArchive (Stream stream)
|
|
: this (stream, false)
|
|
{
|
|
|
|
}
|
|
|
|
public UnzipArchive (Stream stream, bool ownsStream)
|
|
{
|
|
Stream = new ZipStream (stream, ownsStream);
|
|
Handle = NativeVersion.Use32Bit ? NativeUnzip.OpenArchive32 (Stream.IOFunctions32) : NativeUnzip.OpenArchive64 (Stream.IOFunctions64);
|
|
}
|
|
|
|
public void Dispose ()
|
|
{
|
|
NativeUnzip.CloseArchive (Handle);
|
|
Stream.Close ();
|
|
}
|
|
|
|
public System.IO.Packaging.CompressionOption GetCompressionLevel (string file)
|
|
{
|
|
using (UnzipReadStream stream = (UnzipReadStream) GetStream (file))
|
|
return stream.CompressionLevel;
|
|
}
|
|
|
|
public string[] GetFiles ()
|
|
{
|
|
return (string []) Files.Clone ();
|
|
}
|
|
|
|
public Stream GetStream (string name)
|
|
{
|
|
foreach (string file in Files)
|
|
{
|
|
if (name.Equals(file, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
System.IO.Packaging.CompressionOption option;
|
|
NativeUnzip.OpenFile (Handle, name, out option);
|
|
return new UnzipReadStream (this, option);
|
|
}
|
|
}
|
|
|
|
throw new Exception ("The file doesn't exist in the zip archive");
|
|
}
|
|
}
|
|
}
|