internal static byte[] CompressFiles(string rootDir, PackageHash hash) { rootDir = rootDir.TrimEnd(Path.DirectorySeparatorChar); var lengthOfRootDir = rootDir.Length; BinaryFormatter formatter = new BinaryFormatter(); var fileBag = new Dictionary <string, byte[]>(); foreach (var file in hash.Files) { var pathName = file.Substring(lengthOfRootDir).TrimStart(Path.DirectorySeparatorChar); byte[] bytes = File.ReadAllBytes(file); fileBag.Add(pathName, bytes); } byte[] compressedObjectBytes; using (var msCompressed = new MemoryStream()) { using (var msObj = new MemoryStream()) { formatter.Serialize(msObj, fileBag); msObj.Seek(0, SeekOrigin.Begin); using (GZipStream gzs = new GZipStream(msCompressed, CompressionMode.Compress)) { msObj.CopyTo(gzs); } } compressedObjectBytes = msCompressed.ToArray(); } return(compressedObjectBytes); }
/// <summary> /// Returns singleton of Packager with PackageHash created and set. Hashes current app domain's DLL, EXE and CONFIG files. /// </summary> /// <returns></returns> internal static Packager Create() { if (null != _singleton) { return(_singleton); } lock (_syncRoot) { if (null != _singleton) { return(_singleton); } var rootDir = AppDomain.CurrentDomain.BaseDirectory; var exeFiles = Directory.GetFiles(rootDir, "*.exe", SearchOption.AllDirectories); var dllFiles = Directory.GetFiles(rootDir, "*.dll", SearchOption.AllDirectories); var configFiles = Directory.GetFiles(rootDir, "*.config", SearchOption.AllDirectories); var list = exeFiles.Concat(dllFiles).Concat(configFiles).Where(n => !Path.GetFileName(n).Contains(".vshost.")).ToList(); list.Sort(); //get hash codes for each file var fileHashes = new ConcurrentDictionary <string, string>(); Parallel.ForEach(list, file => { using (RIPEMD160 rip = RIPEMD160Managed.Create()) { byte[] hashValue; using (var fileStream = File.OpenRead(file)) { fileStream.Position = 0; hashValue = rip.ComputeHash(fileStream); } fileHashes.TryAdd(file, Convert.ToBase64String(hashValue)); } }); var hash = new PackageHash() { Name = AppDomain.CurrentDomain.FriendlyName, Files = fileHashes.Keys.ToArray(), Hashes = fileHashes.Values.ToArray() }; _singleton = new Packager(hash); return(_singleton); } }
public void AddUpdatePackage(PackageHash hash, byte[] package) { Proxy.AddUpdatePackage(hash, package); }
public bool HasPackage(PackageHash hash) { return(Proxy.HasPackage(hash)); }
private Packager(PackageHash hash) { this.Hash = hash; }