Example #1
0
        public void WriteBlob( string containerName, string blobName, string localFilename, Action<long> progress )
        {
            if( !File.Exists(localFilename) ) {
                throw new FileNotFoundException("local filename does not exist", localFilename);
            }

            if (ContainerExists(containerName)) {
                var container = _blobStore.GetContainerReference(containerName);

                var blob = container.GetBlobReference(blobName);
                var md5 = string.Empty;
                try {
                    blob.FetchAttributes();

                    md5 = blob.Properties.ContentMD5;
                    if (string.IsNullOrEmpty(md5)) {
                        if (blob.Metadata.AllKeys.Contains("MD5")) {
                            md5 = blob.Metadata["MD5"];
                        }
                    }
                } catch {

                }

                var localMD5 = string.Empty;
                using( var stream = new FileStream(localFilename, FileMode.Open, FileAccess.Read, FileShare.Read) ) {
                    localMD5  = MD5.Create().ComputeHash(stream).ToHexString();
                }

                if( !string.Equals(md5, localMD5, StringComparison.CurrentCultureIgnoreCase)) {
                    // different file
                    blob.Properties.ContentType = LookupMimeType(Path.GetExtension(localFilename));
                    try {
                        using (var stream = new ProgressStream(new FileStream(localFilename, FileMode.Open, FileAccess.Read, FileShare.Read), progress)) {
                            blob.UploadFromStream(stream);
                            if( blob.Metadata.AllKeys.Contains("MD5")) {
                                blob.Metadata["MD5"] = localMD5;
                            }
                            else {
                                blob.Metadata.Add("MD5", localMD5);
                            }
                            blob.SetMetadata();
                        }
                    }
                    catch (StorageException e) {
                        if (e.ErrorCode == StorageErrorCode.BlobAlreadyExists || e.ErrorCode == StorageErrorCode.ConditionFailed) {
                            throw new ApplicationException("Concurrency Violation", e);
                        }
                        throw;
                    }
                } else {
                    if( progress != null ) {
                        progress(100);
                    }
                }
                return;
            }
            throw new CoAppException("Container '{0}' does not exist".format(containerName));
        }
Example #2
0
        public void ReadBlob( string containerName, string blobName, string localFilename, Action<long> progress )
        {
            if (ContainerExists(containerName)) {
                var container = _blobStore.GetContainerReference(containerName);
                var blob = container.GetBlobReference(blobName);
                var md5 = string.Empty;
                try {
                    blob.FetchAttributes();

                    md5 = blob.Properties.ContentMD5;
                    if (string.IsNullOrEmpty(md5)) {
                        if (blob.Metadata.AllKeys.Contains("MD5")) {
                            md5 = blob.Metadata["MD5"];
                        }
                    }
                } catch {

                }

                if( blob.Properties.Length == 0 ) {
                    throw new CoAppException("Remote blob '{0}' not found".format(blobName));
                }

                if( File.Exists(localFilename) ) {
                    var localMD5 = string.Empty;
                    using( var stream = new FileStream(localFilename, FileMode.Open, FileAccess.Read, FileShare.Read) ) {
                        localMD5  = MD5.Create().ComputeHash(stream).ToHexString();
                    }
                    if( string.Equals(localMD5, md5, StringComparison.CurrentCultureIgnoreCase)) {
                        if( progress != null ) {
                            progress(100);
                        }

                        return;
                    }

                    localFilename.TryHardToDelete();
                }

                try {
                    using( var stream = new ProgressStream( new FileStream(localFilename, FileMode.CreateNew), blob.Properties.Length , progress )) {
                        blob.DownloadToStream(stream);
                    }
                    // blob.dow
                    // blob.DownloadToFile(localFilename);
                }
                catch (StorageException e) {
                    if (e.ErrorCode == StorageErrorCode.BlobAlreadyExists || e.ErrorCode == StorageErrorCode.ConditionFailed) {
                        throw new ApplicationException("Concurrency Violation", e);
                    }
                    throw;
                }
                return;
            }
            throw new CoAppException("Container '{0}' does not exist".format(containerName));
        }