Exemplo n.º 1
0
        static void Main(string[] args)
        {
            ServicePointManager.DefaultConnectionLimit = 32;
            var container = new CloudStorageAccount(new StorageCredentialsAccountAndKey(args[1], args[2]), true).CreateCloudBlobClient().GetContainerReference(args[3]);
            container.CreateIfNotExist();

            var cloudHashes = new Dictionary<string, string>();
            foreach (CloudBlob blob in container.ListBlobs(new BlobRequestOptions { UseFlatBlobListing = true }))
            {
                cloudHashes[blob.Uri.ToString().Substring(container.Uri.ToString().Length + 1)] = blob.Properties.ContentMD5;
            }

            var localHashes = new Dictionary<string, string>();
            foreach (var file in Directory.EnumerateFiles(args[0], "*", SearchOption.AllDirectories))
            {
                localHashes[file.Substring(args[0].Length + 1).Replace('\\', '/')] = GetMd5(file);
            }

            foreach (var name in cloudHashes.Keys.Where(n => localHashes.ContainsKey(n) && (localHashes[n] != cloudHashes[n])))
            {
                Console.WriteLine("Uploading {0}", name);
                UploadWithMd5(container, name, Path.Combine(args[0], name));
            }
            foreach (var name in localHashes.Keys.Where(n => !cloudHashes.ContainsKey(n)))
            {
                Console.WriteLine("Uploading {0}", name);
                UploadWithMd5(container, name, Path.Combine(args[0], name));
            }
            foreach (var name in cloudHashes.Keys.Where(n => !localHashes.ContainsKey(n)))
            {
                Console.WriteLine("Deleting {0}", name);
                semaphore.WaitOne();
                var blob = container.GetBlobReference(name);
                Interlocked.Increment(ref count);
                blob.BeginDelete((ar) => {
                    blob.EndDelete(ar);
                    semaphore.Release();
                    Interlocked.Decrement(ref count);
                }, null);
            }

            while (count > 0) Thread.Sleep(TimeSpan.FromSeconds(1));
        }