예제 #1
0
        /// <summary>
        /// クラウド側でコピーを行う。
        /// </summary>
        /// <param name="sourceFile">コピー元ファイル</param>
        /// <param name="destinationBlob">コピー先Blob</param>
        /// <param name="destinationFile">コピー先ファイル</param>
        /// <returns>成功:true  失敗:false</returns>
        public bool CopyOnServer(ArchiveFile sourceFile, Blob destinationBlob, ArchiveFile destinationFile)
        {
            CloudBlockBlob destinationBlockBlob = destinationBlob.ArchiveFileToBlob(destinationFile);
            CloudBlockBlob sourceBlockBlob      = ArchiveFileToBlob(sourceFile);

            bool result = false;

            // 本来ならStartCopyAsync等の、ローカルへのDownloadを介さない処理を使いたいが,
            // StartCopyAsyncはストレージアカウントを跨ぐ場合、URIを参照するため、
            // コピー元がpublic Accessでないと失敗する。
            _polly.Execute(
                () =>
            {
                var destContainer = destinationBlob.GetContainerReadOnly(destinationFile.ContainerName);
                destContainer.CreateIfNotExistsAsync().Wait();

                // MSサポートに問い合わせたところ、
                // StartCopyAsyncをWaitすることで完了まで待機してもらえるということなので、その前提で実装する。
                destinationBlockBlob.StartCopyAsync(sourceBlockBlob).Wait();
                _logger.Debug($"Copy result [{destinationBlockBlob.CopyState}] from [{sourceFile.ContainerName}/{sourceFile.FilePath}] to [{destinationFile.ContainerName}/{destinationFile.FilePath}] ");

                if (destinationBlockBlob.CopyState != null &&
                    destinationBlockBlob.CopyState.Status == CopyStatus.Success)
                {
                    result = true;
                }
            });
            return(result);
        }
예제 #2
0
        /// <summary>
        /// ストレージアカウント間でファイルをコピーする
        /// </summary>
        /// <param name="sourceFile">コピー元</param>
        /// <param name="destinationBlob">コピー先Blob</param>
        /// <param name="destinationFile">コピー先ファイル</param>
        /// <exception cref="AggregateException">Result/Waitを使用しているため。詳細はinnerExceptionを参照</exception>
        public void Copy(ArchiveFile sourceFile, Blob destinationBlob, ArchiveFile destinationFile)
        {
            CloudBlockBlob destinationBlockBlob = destinationBlob.ArchiveFileToBlob(destinationFile);
            CloudBlockBlob sourceBlockBlob      = ArchiveFileToBlob(sourceFile);

            // 本来ならStartCopyAsync等の、ローカルへのDownloadを介さない処理を使いたいが,
            // StartCopyAsyncはストレージアカウントを跨ぐ場合、URIを参照するため、
            // コピー元がpublic Accessでないと失敗する。
            // ・・と考えていたが、接続文字列に認証文字まで含めている場合問題ないようなのでこちらは使用しないようにする。
            _polly.Execute(
                () =>
            {
                var destContainer = destinationBlob.GetContainerReadOnly(destinationFile.ContainerName);
                destContainer.CreateIfNotExistsAsync().Wait();

                using (var targetBlobStream = destinationBlockBlob.OpenWriteAsync().Result)
                    using (var sourceBlobStream = sourceBlockBlob.OpenReadAsync().Result)
                    {
                        sourceBlobStream.CopyToAsync(targetBlobStream).Wait();
                    }
            });
        }