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, 그 완성은 복사 프로세스가 완료 의미하지 않습니다. 그 후에 대상 블롭의 복사 상태를 검사해야합니다. –

+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

코드가 작동합니다. 고마워. –

관련 문제