如何删除Azure文件存储文件夹中的所有文件?

时间:2016-02-29 16:51:35

标签: c# azure azure-storage delete-file azure-storage-files

我正在尝试如何删除Azure文件存储中文件夹中的所有文件。

CloudFileDirectory.ListFilesAndDirectories()会返回IEnumerable IListFileItem。但这并没有多大帮助,因为它没有文件名属性或类似属性。

这是我到目前为止所做的:

var folder = root.GetDirectoryReference("myfolder");

if (folder.Exists()) {
    foreach (var file in folder.ListFilesAndDirectories()) {

        // How do I delete 'file'

    }
}

如何将IListFileItem更改为CloudFile,以便致电myfile.Delete()

6 个答案:

答案 0 :(得分:13)

ListFilesAndDirectories可以返回文件和目录,因此您可以获得这两个文件的基类。然后你可以检查它是什么类型和铸造。请注意,您要跟踪任何子目录,以便递归删除其中的文件。

var folder = root.GetDirectoryReference("myfolder");

if (folder.Exists())
{
    foreach (var item in folder.ListFilesAndDirectories())
    {         
        if (item.GetType() == typeof(CloudFile))
        {
            CloudFile file = (CloudFile)item;

            // Do whatever
        }

        else if (item.GetType() == typeof(CloudFileDirectory))
        {
            CloudFileDirectory dir = (CloudFileDirectory)item;

            // Do whatever
        }
    }
}

答案 1 :(得分:1)

获取现有答案,修复了一些错误,并创建了一种扩展方法来递归删除目录

    public static async Task DeleteAllAsync(this ShareDirectoryClient dirClient) {
        var remaining = new Queue<ShareDirectoryClient>();
        remaining.Enqueue(dirClient);

        while (remaining.Count > 0) {
            ShareDirectoryClient dir = remaining.Dequeue();

            await foreach (ShareFileItem item in dir.GetFilesAndDirectoriesAsync()) {
                if (item.IsDirectory) {
                    var subDir = dir.GetSubdirectoryClient(item.Name);
                    await DeleteAllAsync(subDir);
                } else {
                    await dir.DeleteFileAsync(item.Name);
                }
            }

            await dir.DeleteAsync();
        }
    }

喜欢这样

    var dirClient = shareClient.GetDirectoryClient("test");
    await dirClient.DeleteAllAsync();

答案 2 :(得分:0)

使用PowerShell中的递归可以很容易地实现此实现。在指定目录的情况下(可以是根目录),然后删除该目录的所有内容,包括所有文件,子目录。相同的请参考github就绪的PowerShell-https://github.com/kunalchandratre1/DeleteAzureFilesDirectoriesPowerShell

如果您正在寻找逐步指南,请参考以下链接-https://sanganakauthority.blogspot.com/2019/07/delete-azure-file-storage-directory-and.html

答案 3 :(得分:0)

如果您的“目录”中有“目录”,则此递归版本有效

vm-summary

答案 4 :(得分:0)

这种方法应该可以解决问题-如果我错了,或者可以通过任何方式加以改进,请发表评论。

public async override Task DeleteFolder(string storagePath)
{
    var remaining = new Queue<ShareDirectoryClient>();
    remaining.Enqueue(Share.GetDirectoryClient(storagePath));

    while(remaining.Count > 0)
    {
        ShareDirectoryClient dir = remaining.Dequeue();

        await foreach (ShareFileItem item in dir.GetFilesAndDirectoriesAsync())
        {
            if(item.IsDirectory)
            {
                var subDir = dir.GetSubdirectoryClient(item.Name);
                await DeleteFolder(subDir.Path);
            }
            else
            {
                await dir
                    .GetFileClient(item.Name)
                    .DeleteAsync();
            }
        }

        await dir.DeleteAsync();
    }
}

答案 5 :(得分:-1)

现在接受的答案似乎已经过时了。以下代码段使用最新的SDK。为了获得更好的性能,它被实现为for循环而不是递归算法。它发现位于directoryPath的所有文件和文件夹。找到文件后,您可以将其删除。

var rootDirectory = directoryPath != null 
? shareClient.GetDirectoryClient(directoryPath)
: shareClient.GetRootDirectoryClient();

var remaining = new Queue<ShareDirectoryClient>();
remaining.Enqueue(rootDirectory);

while (remaining.Count > 0)
{
    var shareDirectoryClient = remaining.Dequeue();

     await foreach (var item in shareDirectoryClient.GetFilesAndDirectoriesAsync())
     {
          if (!item.IsDirectory)
          {
              var shareFileClient = shareDirectoryClient.GetFileClient(item.Name);
                    files.Add(shareFileClient);
              // do what you want
              await shareFile.DeleteAsync();
          }

          if (item.IsDirectory)
          {
              remaining.Enqueue(shareDirectoryClient.GetSubdirectoryClient(item.Name));
              // do what you want
              await shareFile.DeleteAsync();
          }
     }
}

在上面的代码中,directory可能是null或要删除的目录的路径。

要初始化客户端,可以使用以下方法:

AccountSasBuilder sas = new AccountSasBuilder
{
    Services = AccountSasServices.Files,
    ResourceTypes = AccountSasResourceTypes.All,
    ExpiresOn = DateTimeOffset.UtcNow.AddMonths(1)
};

 sas.SetPermissions(AccountSasPermissions.List | AccountSasPermissions.Read | AccountSasPermissions.Delete);

var credential = new StorageSharedKeyCredential(AccountName, AccountKey);
var sasUri = new UriBuilder(AccountUri);
sasUri.Query = sas.ToSasQueryParameters(credential).ToString();

var shareServiceClient = new ShareServiceClient(sasUri.Uri);
var shareClient = shareServiceClient.GetShareClient(FileShareName);