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

据我所知,云blob 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

该代码有效。非常感谢。 –