如何删除 Azure 文件存储文件夹中的所有文件?
How do I delete all files in an Azure File Storage folder?
我正在研究如何删除 Azure 文件存储中文件夹中的所有文件。
CloudFileDirectory.ListFilesAndDirectories()
returns 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
可以 return 文件和目录,因此您可以获得这两个文件和目录的基础 class。然后你可以检查它是哪种类型并进行转换。请注意,您需要跟踪任何子目录,以便可以递归地删除其中的文件。
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
}
}
}
使用 PowerShell 中的递归可以很容易地实现此实现。在您指定目录的位置 [在您的情况下可以是根目录],然后该目录的所有内容包括所有文件、子目录都将被删除。请参阅 github 就绪的 PowerShell - https://github.com/kunalchandratre1/DeleteAzureFilesDirectoriesPowerShell
如果您的 'directory'
中有 'directories',则此递归版本有效
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();
}
}
接受的答案现在似乎已经过时了。以下代码段使用最新的 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();
}
}
采用现有答案,修复了一些错误并创建了一个扩展方法来递归删除目录
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();
- 使用虚拟机连接到您的 Azure 容器(如果是文件共享,则转到文件共享 > 连接 > 并按照命令粘贴到您的虚拟机中 - 以连接到文件共享)
- 在虚拟机命令界面连接到你的容器(cd 'location of your container')
- 删除文件夹(rm -rf 'folder to be deleted')
我正在研究如何删除 Azure 文件存储中文件夹中的所有文件。
CloudFileDirectory.ListFilesAndDirectories()
returns 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
可以 return 文件和目录,因此您可以获得这两个文件和目录的基础 class。然后你可以检查它是哪种类型并进行转换。请注意,您需要跟踪任何子目录,以便可以递归地删除其中的文件。
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
}
}
}
使用 PowerShell 中的递归可以很容易地实现此实现。在您指定目录的位置 [在您的情况下可以是根目录],然后该目录的所有内容包括所有文件、子目录都将被删除。请参阅 github 就绪的 PowerShell - https://github.com/kunalchandratre1/DeleteAzureFilesDirectoriesPowerShell
如果您的 'directory'
中有 'directories',则此递归版本有效 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();
}
}
接受的答案现在似乎已经过时了。以下代码段使用最新的 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();
}
}
采用现有答案,修复了一些错误并创建了一个扩展方法来递归删除目录
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();
- 使用虚拟机连接到您的 Azure 容器(如果是文件共享,则转到文件共享 > 连接 > 并按照命令粘贴到您的虚拟机中 - 以连接到文件共享)
- 在虚拟机命令界面连接到你的容器(cd 'location of your container')
- 删除文件夹(rm -rf 'folder to be deleted')