С#.net определить zip файл

В настоящее время я использую SharpZip api для обработки записей в zip файле. Он отлично подходит для копирования и распаковки. Хотя, у меня возникли проблемы с идентификацией, является ли файл почтовым индексом или нет. Мне нужно знать, есть ли способ определить, можно ли распаковать файловый поток. Первоначально я использовал

FileStream lFileStreamIn = File.OpenRead(mSourceFile);
lZipFile = new ZipFile(lFileStreamIn);
ZipInputStream lZipStreamTester = new ZipInputStream(lFileStreamIn, mBufferSize);// not working
lZipStreamTester.Read(lBuffer, 0, 0);
if (lZipStreamTester.CanDecompressEntry)
{

LZipStreamTester каждый раз обращается в нуль и оператор if терпит неудачу. Я попробовал это с/без буфера. Кто-нибудь может понять, почему? Я знаю, что я могу проверить расширение файла. Мне нужно что-то более определенное, чем это. Я также знаю, что у zip есть волшебство # (что-то PK), но это не гарантия того, что он всегда будет там, потому что это не требование формата.

Также я читал о .net 4.5, имеющем встроенную поддержку zip, поэтому мой проект может перейти на это вместо sharpzip, но мне все еще не нужен метод /param, похожий на CanDecompressEntry здесь: http://msdn.microsoft.com/en-us/library/3z72378a%28v=vs.110%29

Моим последним средством будет использование try catch и попытка распаковать файл.

Ответ 1

Это базовый класс для компонента, который должен обрабатывать несжатые данные, сжатые PKZIP (sharpziplib) или сжатые GZip (встроенные .net). Возможно, немного больше, чем вам нужно, но должно заставить вас идти. Это пример использования метода @PhonicUK для анализа заголовка потока данных. Выведенные классы, которые вы видите в маленьком factory mathod, обрабатывали специфику распаковки PKZip и GZip.

abstract class Expander
{
    private const int ZIP_LEAD_BYTES = 0x04034b50;
    private const ushort GZIP_LEAD_BYTES = 0x8b1f;

    public abstract MemoryStream Expand(Stream stream); 

    internal static bool IsPkZipCompressedData(byte[] data)
    {
        Debug.Assert(data != null && data.Length >= 4);
        // if the first 4 bytes of the array are the ZIP signature then it is compressed data
        return (BitConverter.ToInt32(data, 0) == ZIP_LEAD_BYTES);
    }

    internal static bool IsGZipCompressedData(byte[] data)
    {
        Debug.Assert(data != null && data.Length >= 2);
        // if the first 2 bytes of the array are theG ZIP signature then it is compressed data;
        return (BitConverter.ToUInt16(data, 0) == GZIP_LEAD_BYTES);
    }

    public static bool IsCompressedData(byte[] data)
    {
        return IsPkZipCompressedData(data) || IsGZipCompressedData(data);
    }

    public static Expander GetExpander(Stream stream)
    {
        Debug.Assert(stream != null);
        Debug.Assert(stream.CanSeek);
        stream.Seek(0, 0);

        try
        {
            byte[] bytes = new byte[4];

            stream.Read(bytes, 0, 4);

            if (IsGZipCompressedData(bytes))
                return new GZipExpander();

            if (IsPkZipCompressedData(bytes))
                return new ZipExpander();

            return new NullExpander();
        }
        finally
        {
            stream.Seek(0, 0);  // set the stream back to the begining
        }
    }
}

Ответ 2

Просмотреть https://stackoverflow.com/a/16587134/206730 ссылку

Проверьте ссылки ниже:

icsharpcode-sharpziplib-validate-zip-file

How-to-check-if-a-file-is-compression-in-С#

Файлы ZIP всегда начинаются с 0x04034b50 (4 байта)
Подробнее: http://en.wikipedia.org/wiki/Zip_(file_format)#File_headers

Использование образца:

        bool isPKZip = IOHelper.CheckSignature(pkg, 4, IOHelper.SignatureZip);
        Assert.IsTrue(isPKZip, "Not ZIP the package : " + pkg);

// http://blog.somecreativity.com/2008/04/08/how-to-check-if-a-file-is-compressed-in-c/
    public static partial class IOHelper
    {
        public const string SignatureGzip = "1F-8B-08";
        public const string SignatureZip = "50-4B-03-04";

        public static bool CheckSignature(string filepath, int signatureSize, string expectedSignature)
        {
            if (String.IsNullOrEmpty(filepath)) throw new ArgumentException("Must specify a filepath");
            if (String.IsNullOrEmpty(expectedSignature)) throw new ArgumentException("Must specify a value for the expected file signature");
            using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                if (fs.Length < signatureSize)
                    return false;
                byte[] signature = new byte[signatureSize];
                int bytesRequired = signatureSize;
                int index = 0;
                while (bytesRequired > 0)
                {
                    int bytesRead = fs.Read(signature, index, bytesRequired);
                    bytesRequired -= bytesRead;
                    index += bytesRead;
                }
                string actualSignature = BitConverter.ToString(signature);
                if (actualSignature == expectedSignature) return true;
                return false;
            }
        }

    }

Ответ 3

Вы можете:

  • Используйте структуру try-catch и попытайтесь прочитать структуру потенциального zip файла
  • Разберите заголовок файла, чтобы узнать, является ли он zip файлом

Файлы ZIP всегда начинаются с 0x04034b50 как первые 4 байта (http://en.wikipedia.org/wiki/Zip_(file_format)#File_headers)

Ответ 4

Если вы программируете для Интернета, вы можете проверить файл Тип содержимого: application/zip