///<summary>Updates the blobs in a storage container.</summary> ///<param name="container">The container to update.</param> ///<param name="newVersion">The new version being uploaded.</param> ///<param name="sourcePath">The directory on the local disk containing the new files.</param> public static void UpdateStorage(CloudBlobContainer container, Version newVersion, string sourcePath) { container.FetchAttributes(); var remoteFiles = container.ListBlobs(Options).Cast<CloudBlob>().ToArray(); var oldBlobs = remoteFiles.ToDictionary( blob => Path.Combine(sourcePath, container.Uri.MakeRelativeUri(blob.Uri).ToString().Replace('/', '\\') ) ); var baseUri = new Uri(sourcePath, UriKind.Absolute); foreach (var file in new DirectoryInfo(sourcePath).EnumerateFiles("*", SearchOption.AllDirectories)) { CloudBlob blob; byte[] hash = file.SHA512Hash(); //If there already is a blob for this file, use it. if (!oldBlobs.TryGetValue(file.FullName, out blob)) { blob = container.GetBlobReference(baseUri.MakeRelativeUri(new Uri(file.FullName, UriKind.Absolute)).ToString()); } else { oldBlobs.Remove(file.FullName); //Remove the blob from the dictionary; all blobs left in the dictionary will be deleted. if (file.Length == blob.Properties.Length && Convert.FromBase64String(blob.Metadata["SHA512"]).SequenceEqual(hash)) continue; //If the blob is identical, don't re-upload it. } blob.Metadata["SHA512"] = Convert.ToBase64String(hash); blob.UploadFile(file.FullName); } foreach (var blob in oldBlobs.Values) blob.Delete(); container.Metadata["Version"] = newVersion.ToString(); container.SetMetadata(); }