Работа с zip-архивами
2 июня 2008 - 21:37
Всё таки в Microsoft были неправы, сделав интернальными столько полезных классов в .Net Framework.
Вот например, работа с *.zip файлами. Класс есть, но он интернальный, а возможность работать дана тока с пакэйджами (package - это такие zip-архивы, которые содержат Content_Types.xml, например документы 2007-го офиса). И вот зачем спрашивается надо было закрывать? Пришлось воспользоваться рефлекшеном для работы:
Вот например, работа с *.zip файлами. Класс есть, но он интернальный, а возможность работать дана тока с пакэйджами (package - это такие zip-архивы, которые содержат Content_Types.xml, например документы 2007-го офиса). И вот зачем спрашивается надо было закрывать? Пришлось воспользоваться рефлекшеном для работы:
Assembly asm = Assembly.GetAssembly(typeof (ZipPackage)); Type ZipArchiveType = asm.GetType("MS.Internal.IO.Zip.ZipArchive"); Type ZipFileInfoType = asm.GetType("MS.Internal.IO.Zip.ZipFileInfo"); MethodInfo openOnStreamMethod = ZipArchiveType.GetMethod("OpenOnStream", BindingFlags.Static | BindingFlags.NonPublic); object archive = openOnStreamMethod.Invoke(null, new object[] {stream, FileMode.Open, FileAccess.Read, false}); MethodInfo getFileMethod = ZipArchiveType.GetMethod("GetFile", BindingFlags.NonPublic | BindingFlags.Instance); object contentFile = getFileMethod.Invoke(archive, new object[] {"content.xml"}); MethodInfo getStreamMethod = ZipFileInfoType.GetMethod("GetStream", BindingFlags.NonPublic | BindingFlags.Instance); using (Stream contentStream = (Stream)getStreamMethod.Invoke(contentFile, new object[] { FileMode.Open, FileAccess.Read })) { // Здесь можно без проблем использовать распакованные данные }