0

同じストレージアカウント上の共有とblobの間でいくつかのファイルを移動する必要があります。私は、このコードになってしまったいくつかのgoogleing後 :azureファイル共有とblobの間のファイルの移動

CloudFileClient fileClient = account.CreateCloudFileClient(); 
CloudFileShare share = fileClient.GetShareReference("shareName"); 
CloudFileDirectory rootDir = share.GetRootDirectoryReference(); 
CloudFileDirectory videoDirectory = rootDir.GetDirectoryReference(video.StoragePath); 
CloudBlobClient blobClient = account.CreateCloudBlobClient(); 
CloudBlobContainer container = blobClient.GetContainerReference(video.StoragePath); 
container.CreateIfNotExists(); 

foreach (var Files in videoDirectory.ListFilesAndDirectories()) 
{ 
    var arr = Files.Uri.ToString().Split('/'); 
    string strFileName = arr[arr.Length - 1]; 
    CloudFile sourceFile = videoDirectory.GetFileReference(strFileName); 
    string fileSas = sourceFile.GetSharedAccessSignature(new SharedAccessFilePolicy() 
    { 
     Permissions = SharedAccessFilePermissions.Read, 
     SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24) 
    }); 

    Uri fileSasUri = new Uri(sourceFile.StorageUri.PrimaryUri.ToString() + fileSas); 

    CloudBlockBlob blockBlob = container.GetBlockBlobReference(strFileName); 
    blockBlob.StartCopyAsync(fileSasUri).Wait(); //copy the file to blob storage and wait for the operation to complete 
    //sourceFile.DeleteAsync(); //delete the file 
} 
//videoDirectory.DeleteAsync(); //delete the directory 

削除行が先をコメント解除している場合は、ソースフォルダではなく、サイズが0であるすべてのファイルが含まれています。

私は間違って何をしていますか?

また、すべてのファイルをコピーした後に共有ディレクトリを削除したいと考えています。ファイルが宛先フォルダにあるかどうかを確認する方法はありますか?

+0

StartCopyを(asynchrousあり、その完了は、コピー処理が完了したことを意味しません。その後、コピー先のBLOBのコピー状態をチェックする必要があります。 –

+0

(私は今見つけることができません)stackoverflowの別の答えによると、私はStartCopy()とDelete()を次々にやることができ、操作は同じアカウントで同期して実行されます。私もそれを試み、ファイルのサイズが0だった。 –

答えて

3

私が知る限り、クラウドブロブのStartCopyAsyncメソッドは、サーバー側がファイルストレージにBLOBをコピーするように指示することを意味します。

しかし、コピー操作が完全に実行されるのを待つことはありません。

ファイルがすでに完全に実行された後にファイルを削除する場合は、FetchAttributesメソッドを使用してBLOBのステータスを取得する必要があります。

ステータスが完了している場合は、ファイルを削除できます。

詳細は、あなたがコードに従うことを指すこともできます)

CloudStorageAccount account = CloudStorageAccount.Parse(
"connection string"); 
     CloudFileClient fileClient = account.CreateCloudFileClient(); 

     CloudFileShare share = fileClient.GetShareReference("sharetest"); 

     CloudFileDirectory rootDir = share.GetRootDirectoryReference(); 

     CloudFileDirectory videoDirectory = rootDir.GetDirectoryReference("TestDirectory"); 

     CloudBlobClient blobClient = account.CreateCloudBlobClient(); 

     CloudBlobContainer container = blobClient.GetContainerReference("testdirectory"); 

     container.CreateIfNotExists(); 

     foreach (var Files in videoDirectory.ListFilesAndDirectories()) 
     { 
      var arr = Files.Uri.ToString().Split('/'); 
      string strFileName = arr[arr.Length - 1]; 
      CloudFile sourceFile = videoDirectory.GetFileReference(strFileName); 
      string fileSas = sourceFile.GetSharedAccessSignature(new SharedAccessFilePolicy() 
      { 
       Permissions = SharedAccessFilePermissions.Read, 
       SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24) 
      }); 

      Uri fileSasUri = new Uri(sourceFile.StorageUri.PrimaryUri.ToString() + fileSas); 

      CloudBlockBlob blockBlob = container.GetBlockBlobReference(strFileName); 

      blockBlob.StartCopyAsync(fileSasUri).Wait(); 
      blockBlob.FetchAttributes(); 
      while (blockBlob.CopyState.Status == CopyStatus.Pending) 
      { 
       Thread.Sleep(50); 
       blockBlob.FetchAttributes(); 
      } 

      if (blockBlob.CopyState.Status == CopyStatus.Success) 
      { 
       sourceFile.DeleteAsync(); 
      } 
+0

コードは機能します。どうもありがとう。 –

関連する問題