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)); }