Перемещение файлов между общей папкой Azure и BLOB-объектами
Я должен переместить некоторые файлы между общим ресурсом и большим двоичным объектом в одной учетной записи хранения. После некоторого Google я получил этот код:
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.
Есть идеи, что я делаю не так?
Я также хочу удалить общий каталог после того, как все файлы скопированы. Есть ли способ проверить, находятся ли файлы в папке назначения?
1 ответ
Насколько я знаю, метод StartCopyAsync облачного блоба означает, что вы указываете серверной стороне начинать копировать блоб из хранилища файлов.
Но он не будет ждать выполнения операции копирования полностью.
Поэтому, если вы хотите удалить файл после того, как файл уже полностью выполнен, вы должны использовать метод 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();
}