#c# #.net #azure-functions #azure-storage #azure-files
Вопрос:
Я пытаюсь создать функцию azure, которая будет очищать файлы старше определенного возраста, но когда я получаю доступ к свойствам файла, все они равны нулю, что я делаю не так?!
using System;
using System.Collections.Generic;
using Azure.Storage.Files.Shares;
using Azure.Storage.Files.Shares.Models;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
namespace somewhere
{
public static class FileShareCleaner
{
[FunctionName("FileShareCleaner")]
public static void Run([TimerTrigger("*/10 */1 * * * *")]TimerInfo myTimer, ILogger log)
{
string connectionString = Environment.GetEnvironmentVariable("FileShareConnectionString");
string shareName = "files";
ShareServiceClient shareserviceclient = new ShareServiceClient(connectionString);
ShareClient shareclient = shareserviceclient.GetShareClient(shareName);
Queue<ShareDirectoryClient> remaining = new Queue<ShareDirectoryClient>();
remaining.Enqueue(shareclient.GetRootDirectoryClient());
while (remaining.Count > 0)
{
ShareDirectoryClient dir = remaining.Dequeue();
foreach (ShareFileItem item in dir.GetFilesAndDirectories())
{
log.LogInformation(item.Name);
if (item.IsDirectory)
{
remaining.Enqueue(dir.GetSubdirectoryClient(item.Name));
}
else
{
log.LogInformation($"time: {item.Properties.LastModified.ToString()}");
}
}
}
}
}
}
Код находит файлы, но все свойства равны нулю:
[2021-10-06T10:04:50.048Z] Executing 'FileShareCleaner' (Reason='Timer fired at 2021-10-06T11:04:50.0126493 01:00', Id=af5c7864-4326-4c97-b9d6-82bf98726f4e)
[2021-10-06T10:04:50.341Z] 0304ccf5-4e32-4206-b903-af5acc8652dc.dat
[2021-10-06T10:04:50.344Z] time:
[2021-10-06T10:04:50.347Z] 06716b40-cce4-4ef0-86ec-329dcaeddbf4.dat
[2021-10-06T10:04:50.350Z] time:
[2021-10-06T10:04:50.353Z] 20735b83-d8b2-4110-9ee6-6154b97c154c.dat
[2021-10-06T10:04:50.355Z] time:
[2021-10-06T10:04:50.358Z] 2696a0eb-2aed-4200-b495-0dd2a7152139.dat
[2021-10-06T10:04:50.361Z] time:
Ответ №1:
Вы не делаете ничего плохого. Это ожидаемое поведение.
По умолчанию, когда файлы и папки перечислены в общей папке, возвращается только размер файла.
Для извлечения других свойств файла, таких как свойства последнего изменения или содержимого, вам нужно будет получить свойства каждого файла отдельно.
Обновить
Чтобы получить свойства, вам нужно будет создать экземпляр ShareFileClient
using ShareDirectoryClient.GetFileClient
и затем вызвать GetProperties
его. Ваш код будет выглядеть примерно так, как показано ниже:
while (remaining.Count > 0)
{
ShareDirectoryClient dir = remaining.Dequeue();
foreach (ShareFileItem item in dir.GetFilesAndDirectories())
{
log.LogInformation(item.Name);
if (item.IsDirectory)
{
remaining.Enqueue(dir.GetSubdirectoryClient(item.Name));
}
else
{
var fileClient = dir.GetFileClient(item.Name);
var fileProperties = fileClient.GetProperties();
log.LogInformation($"time: {properties.LastModified.ToString()}");
}
}
}
Комментарии:
1. спасибо — есть ли пример / документы о том, что для этого использовать? Я попытался использовать объект CloudFile, но это тоже не сработало
2. Обновил свой ответ с помощью примера кода (хотя и непроверенного). ХТ.
3. так и есть, спасибо! Мне просто пришлось немного изменить инструкцию журнала, чтобы
fileProperties.Value.LastModified.ToString()