如何删除 Azure 文件存储文件夹中的所有文件
本文关键字:文件 文件夹 存储文件 存储 删除 Azure 何删除 | 更新日期: 2023-09-27 18:36:48
我正在尝试如何删除 Azure 文件存储中文件夹中的所有文件。
CloudFileDirectory.ListFilesAndDirectories()
返回IListFileItem
的IEnumerable
。但这并没有多大帮助,因为它没有文件名属性或类似属性。
这是我到目前为止所拥有的:
var folder = root.GetDirectoryReference("myfolder");
if (folder.Exists()) {
foreach (var file in folder.ListFilesAndDirectories()) {
// How do I delete 'file'
}
}
如何将IListFileItem
更改为CloudFile
以便我可以呼叫myfile.Delete()
?
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
}
}
}
获取现有答案,修复一些错误并创建一个扩展方法来递归删除目录
public static async Task DeleteAllAsync(this ShareDirectoryClient dirClient) {
await foreach (ShareFileItem item in dirClient.GetFilesAndDirectoriesAsync()) {
if (item.IsDirectory) {
var subDir = dirClient.GetSubdirectoryClient(item.Name);
await subDir.DeleteAllAsync();
} else {
await dirClient.DeleteFileAsync(item.Name);
}
}
await dirClient.DeleteAsync();
}
称呼它为喜欢
var dirClient = shareClient.GetDirectoryClient("test");
await dirClient.DeleteAllAsync();
如果你的"目录"中有"目录",这个递归版本就有效
public void DeleteOutputDirectory()
{
var share = _fileClient.GetShareReference(_settings.FileShareName);
var rootDir = share.GetRootDirectoryReference();
DeleteDirectory(rootDir.GetDirectoryReference("DirName"));
}
private static void DeleteDirectory(CloudFileDirectory directory)
{
if (directory.Exists())
{
foreach (IListFileItem item in directory.ListFilesAndDirectories())
{
switch (item)
{
case CloudFile file:
file.Delete();
break;
case CloudFileDirectory dir:
DeleteDirectory(dir);
break;
}
}
directory.Delete();
}
}
使用PowerShell中的递归很容易实现此实现。在您指定目录的地方[在您的情况下可以是根目录],然后该目录的所有内容(包括所有文件)将被删除子目录。请参考 github 就绪的 PowerShell 了解相同的内容 - https://github.com/kunalchandratre1/DeleteAzureFilesDirectoriesPowerShell
公认的答案现在似乎已经过时了。以下代码片段使用最新的 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);
这种方法应该可以解决问题 - 如果我错了,请发表评论,或者可以以任何方式改进。
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();
}
}
- 使用虚拟机连接到 Azure 容器(如果是文件共享,请转到文件共享>连接>并按照命令粘贴到虚拟机中 - 连接到文件共享)
- 在虚拟机命令界面中连接到容器(cd"容器的位置")
- 删除文件夹(rm -rf "要删除的文件夹")