0

Ich muss einige Dateien zwischen einer Freigabe und einem Blob auf dem gleichen Speicherkonto verschieben. Nach einigem googleing ich mit diesem Code endete:Verschieben Sie Dateien zwischen Azure-Dateifreigabe und 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 

Wenn die Löschleitungen das Ziel unkommentiert sind enthält alle Dateien im Quellordner aber mit 0 in der Größe.

Irgendwelche Ideen was mache ich falsch?

Ich möchte auch das Freigabeverzeichnis löschen, nachdem alle Dateien kopiert wurden. Gibt es eine Möglichkeit zu überprüfen, ob sich die Dateien im Zielordner befinden?

+0

StartCopy() ist asynchrous, dessen Fertigstellung bedeutet nicht der Kopiervorgang beendet ist. Sie müssen danach den Kopierstatus im Ziel-Blob überprüfen. –

+0

Nach einer anderen Antwort auf Stackoverflow (ich kann jetzt nicht finden), konnte ich nacheinander StartCopy() und Delete() ausführen und die Operationen werden synchron auf dem gleichen Konto ausgeführt. Ich habe das auch ausprobiert und die Dateien hatten 0 in der Größe. –

Antwort

3

Soweit ich weiß, die Cloud Blob StartCopyAsync-Methode bedeutet, dass Sie die serverseitige beginnen, Blob aus dem Dateispeicher zu kopieren.

Aber es wird nicht warten, dass der Kopiervorgang vollständig ausgeführt wird.

Wenn Sie also die Datei löschen möchten, nachdem die Datei bereits vollständig ausgeführt wurde, sollten Sie die FetchAttributes-Methode verwenden, um den Status des Blobs abzurufen.

Wenn der Status vollständig ist, können Sie die Datei löschen.

Weitere Details können Sie verweisen Codes folgen:

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

Der Code funktioniert. Danke vielmals. –

Verwandte Themen