コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
 public void AddUpdatePackage(PackageHash hash, byte[] package)
 {
     Proxy.AddUpdatePackage(hash, package);
 }
コード例 #4
0
 public bool HasPackage(PackageHash hash)
 {
     return(Proxy.HasPackage(hash));
 }
コード例 #5
0
 private Packager(PackageHash hash)
 {
     this.Hash = hash;
 }