我正在尝试如何删除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()
?
答案 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);