using System.Buffers; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using System.Text; [assembly: AssemblyFileVersion("4.6.57.0")] [assembly: AssemblyInformationalVersion("4.6.57.0")] [assembly: AssemblyCopyright("(c) Various Mono authors")] [assembly: AssemblyProduct("Mono Common Language Infrastructure")] [assembly: AssemblyCompany("Mono development team")] [assembly: AssemblyDefaultAlias("System.IO.Compression.FileSystem.dll")] [assembly: AssemblyDescription("System.IO.Compression.FileSystem.dll")] [assembly: AssemblyTitle("System.IO.Compression.FileSystem.dll")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyDelaySign(true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("4.0.0.0")] [module: UnverifiableCode] internal static class Consts { public const string MonoCorlibVersion = "1A5E0066-58DC-428A-B21C-0AD6CDAE2789"; public const string MonoVersion = "6.13.0.0"; public const string MonoCompany = "Mono development team"; public const string MonoProduct = "Mono Common Language Infrastructure"; public const string MonoCopyright = "(c) Various Mono authors"; public const string FxVersion = "4.0.0.0"; public const string FxFileVersion = "4.6.57.0"; public const string EnvironmentVersion = "4.0.30319.42000"; public const string VsVersion = "0.0.0.0"; public const string VsFileVersion = "11.0.0.0"; private const string PublicKeyToken = "b77a5c561934e089"; public const string AssemblyI18N = "I18N, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMicrosoft_JScript = "Microsoft.JScript, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMono_Http = "Mono.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Posix = "Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Security = "Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyCorlib = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem = "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Data = "System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Design = "System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing = "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Messaging = "System.Messaging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Security = "System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Web = "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_2_0 = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystemCore_3_5 = "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Core = "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string WindowsBase_3_0 = "WindowsBase, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyWindowsBase = "WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_3_5 = "PresentationCore, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_4_0 = "PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationFramework_3_5 = "PresentationFramework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblySystemServiceModel_3_0 = "System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; } internal class SR { public const string IO_DirectoryNameWithData = "Zip entry name ends in directory separator character but contains data."; public const string IO_ExtractingResultsInOutside = "Extracting Zip entry would have resulted in a file outside the specified destination directory."; } namespace System.IO { internal static class PathInternal { private static readonly bool s_isCaseSensitive = GetIsCaseSensitive(); internal static StringComparison StringComparison { get { if (!s_isCaseSensitive) { return StringComparison.OrdinalIgnoreCase; } return StringComparison.Ordinal; } } internal static bool IsCaseSensitive => s_isCaseSensitive; private static bool GetIsCaseSensitive() { try { string text = Path.Combine(Path.GetTempPath(), "CASESENSITIVETEST" + Guid.NewGuid().ToString("N")); using (new FileStream(text, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None, 4096, FileOptions.DeleteOnClose)) { return !File.Exists(text.ToLowerInvariant()); } } catch (Exception) { return false; } } } } namespace System.IO.Compression { public static class ZipFile { private const char PathSeparator = '/'; public static ZipArchive OpenRead(string archiveFileName) { return Open(archiveFileName, ZipArchiveMode.Read); } public static ZipArchive Open(string archiveFileName, ZipArchiveMode mode) { return Open(archiveFileName, mode, null); } public static ZipArchive Open(string archiveFileName, ZipArchiveMode mode, Encoding entryNameEncoding) { FileMode mode2; FileAccess access; FileShare share; switch (mode) { case ZipArchiveMode.Read: mode2 = FileMode.Open; access = FileAccess.Read; share = FileShare.Read; break; case ZipArchiveMode.Create: mode2 = FileMode.CreateNew; access = FileAccess.Write; share = FileShare.None; break; case ZipArchiveMode.Update: mode2 = FileMode.OpenOrCreate; access = FileAccess.ReadWrite; share = FileShare.None; break; default: throw new ArgumentOutOfRangeException("mode"); } FileStream fileStream = new FileStream(archiveFileName, mode2, access, share, 4096, useAsync: false); try { return new ZipArchive(fileStream, mode, leaveOpen: false, entryNameEncoding); } catch { fileStream.Dispose(); throw; } } public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName) { DoCreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, null, includeBaseDirectory: false, null); } public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel compressionLevel, bool includeBaseDirectory) { DoCreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, compressionLevel, includeBaseDirectory, null); } public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel compressionLevel, bool includeBaseDirectory, Encoding entryNameEncoding) { DoCreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, compressionLevel, includeBaseDirectory, entryNameEncoding); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName) { ExtractToDirectory(sourceArchiveFileName, destinationDirectoryName, null); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, bool overwrite) { ExtractToDirectory(sourceArchiveFileName, destinationDirectoryName, null, overwrite); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, Encoding entryNameEncoding) { ExtractToDirectory(sourceArchiveFileName, destinationDirectoryName, entryNameEncoding, overwrite: false); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, Encoding entryNameEncoding, bool overwrite) { if (sourceArchiveFileName == null) { throw new ArgumentNullException("sourceArchiveFileName"); } using ZipArchive source = Open(sourceArchiveFileName, ZipArchiveMode.Read, entryNameEncoding); source.ExtractToDirectory(destinationDirectoryName, overwrite); } private static void DoCreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel? compressionLevel, bool includeBaseDirectory, Encoding entryNameEncoding) { sourceDirectoryName = Path.GetFullPath(sourceDirectoryName); destinationArchiveFileName = Path.GetFullPath(destinationArchiveFileName); using ZipArchive zipArchive = Open(destinationArchiveFileName, ZipArchiveMode.Create, entryNameEncoding); bool flag = true; DirectoryInfo directoryInfo = new DirectoryInfo(sourceDirectoryName); string fullName = directoryInfo.FullName; if (includeBaseDirectory && directoryInfo.Parent != null) { fullName = directoryInfo.Parent.FullName; } char[] buffer = ArrayPool.Shared.Rent(260); try { foreach (FileSystemInfo item in directoryInfo.EnumerateFileSystemInfos("*", SearchOption.AllDirectories)) { flag = false; int length = item.FullName.Length - fullName.Length; if (item is FileInfo) { string entryName = EntryFromPath(item.FullName, fullName.Length, length, ref buffer); ZipFileExtensions.DoCreateEntryFromFile(zipArchive, item.FullName, entryName, compressionLevel); } else if (item is DirectoryInfo possiblyEmptyDir && IsDirEmpty(possiblyEmptyDir)) { string entryName2 = EntryFromPath(item.FullName, fullName.Length, length, ref buffer, appendPathSeparator: true); zipArchive.CreateEntry(entryName2); } } if (includeBaseDirectory && flag) { zipArchive.CreateEntry(EntryFromPath(directoryInfo.Name, 0, directoryInfo.Name.Length, ref buffer, appendPathSeparator: true)); } } finally { ArrayPool.Shared.Return(buffer); } } private static string EntryFromPath(string entry, int offset, int length, ref char[] buffer, bool appendPathSeparator = false) { while (length > 0 && (entry[offset] == Path.DirectorySeparatorChar || entry[offset] == Path.AltDirectorySeparatorChar)) { offset++; length--; } if (length == 0) { if (!appendPathSeparator) { return string.Empty; } return '/'.ToString(); } int num = (appendPathSeparator ? (length + 1) : length); EnsureCapacity(ref buffer, num); entry.CopyTo(offset, buffer, 0, length); for (int i = 0; i < length; i++) { char c = buffer[i]; if (c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar) { buffer[i] = '/'; } } if (appendPathSeparator) { buffer[length] = '/'; } return new string(buffer, 0, num); } private static void EnsureCapacity(ref char[] buffer, int min) { if (buffer.Length < min) { int num = buffer.Length * 2; if (num < min) { num = min; } ArrayPool.Shared.Return(buffer); buffer = ArrayPool.Shared.Rent(num); } } private static bool IsDirEmpty(DirectoryInfo possiblyEmptyDir) { using IEnumerator enumerator = Directory.EnumerateFileSystemEntries(possiblyEmptyDir.FullName).GetEnumerator(); return !enumerator.MoveNext(); } } [EditorBrowsable(EditorBrowsableState.Never)] public static class ZipFileExtensions { public static ZipArchiveEntry CreateEntryFromFile(this ZipArchive destination, string sourceFileName, string entryName) { return DoCreateEntryFromFile(destination, sourceFileName, entryName, null); } public static ZipArchiveEntry CreateEntryFromFile(this ZipArchive destination, string sourceFileName, string entryName, CompressionLevel compressionLevel) { return DoCreateEntryFromFile(destination, sourceFileName, entryName, compressionLevel); } public static void ExtractToDirectory(this ZipArchive source, string destinationDirectoryName) { source.ExtractToDirectory(destinationDirectoryName, overwrite: false); } public static void ExtractToDirectory(this ZipArchive source, string destinationDirectoryName, bool overwrite) { if (source == null) { throw new ArgumentNullException("source"); } if (destinationDirectoryName == null) { throw new ArgumentNullException("destinationDirectoryName"); } string text = Directory.CreateDirectory(destinationDirectoryName).FullName; if (!text.EndsWith(Path.DirectorySeparatorChar)) { text += Path.DirectorySeparatorChar; } foreach (ZipArchiveEntry entry in source.Entries) { string fullPath = Path.GetFullPath(Path.Combine(text, entry.FullName)); if (!fullPath.StartsWith(text, System.IO.PathInternal.StringComparison)) { throw new IOException("Extracting Zip entry would have resulted in a file outside the specified destination directory."); } if (Path.GetFileName(fullPath).Length == 0) { if (entry.Length != 0L) { throw new IOException("Zip entry name ends in directory separator character but contains data."); } Directory.CreateDirectory(fullPath); } else { Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); entry.ExtractToFile(fullPath, overwrite); } } } internal static ZipArchiveEntry DoCreateEntryFromFile(ZipArchive destination, string sourceFileName, string entryName, CompressionLevel? compressionLevel) { if (destination == null) { throw new ArgumentNullException("destination"); } if (sourceFileName == null) { throw new ArgumentNullException("sourceFileName"); } if (entryName == null) { throw new ArgumentNullException("entryName"); } using Stream stream = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, useAsync: false); ZipArchiveEntry zipArchiveEntry = (compressionLevel.HasValue ? destination.CreateEntry(entryName, compressionLevel.Value) : destination.CreateEntry(entryName)); DateTime dateTime = File.GetLastWriteTime(sourceFileName); if (dateTime.Year < 1980 || dateTime.Year > 2107) { dateTime = new DateTime(1980, 1, 1, 0, 0, 0); } zipArchiveEntry.LastWriteTime = dateTime; using (Stream destination2 = zipArchiveEntry.Open()) { stream.CopyTo(destination2); } return zipArchiveEntry; } public static void ExtractToFile(this ZipArchiveEntry source, string destinationFileName) { source.ExtractToFile(destinationFileName, overwrite: false); } public static void ExtractToFile(this ZipArchiveEntry source, string destinationFileName, bool overwrite) { if (source == null) { throw new ArgumentNullException("source"); } if (destinationFileName == null) { throw new ArgumentNullException("destinationFileName"); } FileMode mode = ((!overwrite) ? FileMode.CreateNew : FileMode.Create); using (Stream destination = new FileStream(destinationFileName, mode, FileAccess.Write, FileShare.None, 4096, useAsync: false)) { using Stream stream = source.Open(); stream.CopyTo(destination); } File.SetLastWriteTime(destinationFileName, source.LastWriteTime.DateTime); } } }