IFileProvider, возвращающий 01/01/0001 для даты последнего изменения всех файлов в физическом провайдере

При запуске я установил свой IFileProvider в службах настройки следующим образом:

            IFileProvider physicalProvider = new PhysicalFileProvider(Directory.GetParent(env.ContentRootPath).ToString());
        services.AddSingleton<IFileProvider>(physicalProvider);

Теперь, когда я иду использовать, чтобы найти дату последнего изменения файлов в моем контроллере, я получаю дату 01/01/0001 для всех файлов. Мой код выглядит следующим образом:

    private readonly IWebHostEnvironment env;
    private IFileProvider _fileProvider;
    public IConfiguration Configuration { get; }

    public MainReviewController(LoginDBContext context, IConfiguration configuration, IWebHostEnvironment env, IFileProvider fileProvider)
    {
        _context = context;
        connectionString = configuration["ConnectionStrings:DBContext"];
        this.env = env;
        _fileProvider = fileProvider;
    }

После того, как я использую внедрение зависимостей для использования поставщика файлов, я использую следующий код в своем почтовом запросе

                    var rootPath = Path.Combine(Directory.GetParent(env.ContentRootPath).ToString(), "ARMSFiles");

                foreach (var file in mainreviewdocuments)
                {
                    var filePath = Path.Combine(rootPath, file.DOCUMENT_FULL_PATH);
                    System.Diagnostics.Debug.WriteLine(filePath);
                    System.Diagnostics.Debug.WriteLine(_fileProvider.GetFileInfo(filePath).LastModified);
                }

Любые идеи по этому поводу? В моем запуске я также использую внедрение зависимостей, чтобы убедиться, что я использую ту же переменную env, что и мой контроллер, поэтому каталоги должны выстраиваться. По сути, это папка за пределами моей корневой папки, поскольку она немного более безопасна, и я использую ее для веб-сайта, когда фактически развертываю ее.

filePath это folder или file?

Jason Pan 17.03.2022 07:51

путь к файлу — это полный путь к файлу, поэтому C:\inetpub\files\sampledoc.docx

Bradyboyy88 17.03.2022 15:10

@ Джейсон Пэн Есть идеи?

Bradyboyy88 18.03.2022 16:26

Я проверил использование _fileProvider в моем регионе, и он работает хорошо. Если файл не существует, значение LastModified равно 01/01/0001 должно быть ожидаемым поведением.

Jason Pan 21.03.2022 09:12

FileProvider использует пути к файлам относительный; в конце концов, это корневая виртуальная файловая система. И вам, как правило, не следует выходить за пределы корневой папки веб-приложений, что вы, похоже, и делаете. Проблема только с LastModified или со всем (как я подозреваю)? Имеет ли пользователь вашего приложения доступ к папке с файлами? Это работает, когда вы не используете файловый провайдер? Почему вы создаете поставщика файлов в родитель корневого пути вашего контента?

Luaan 21.03.2022 09:20

Проблема заключалась в относительном пути, как вы указали. Я использовал absolute в параметре GetFileInfo(), что было неправильно, поэтому файла там не было. Судя по вашему комментарию, это плохая практика, даже если у меня есть сервер webdav, работающий на IIS? Я решил, что лучше всего сделать папку webdav вне папки wwwroot, так как это относится к веб-серверу. Он также установлен как виртуальный путь, но я не могу вспомнить, почему именно это сделал, лол. Прошло некоторое время с тех пор, как я установил это.

Bradyboyy88 21.03.2022 19:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я использую приведенный ниже код и получаю значение LastModified;

IDirectoryContents dirContents = _fileProvider.GetDirectoryContents("ARMSFiles");
IFileInfo fileInfo = _fileProvider.GetFileInfo("ARMSFiles/TextFile.txt");

Результат испытаний

Тестовый код:

Советы: приведенный ниже код предназначен только для тестирования, пожалуйста, не используйте его напрямую в своей производственной среде.

1. Метод испытаний

public IActionResult TestFileProvider()
{
    // the static root path, just for test
    string filePath = @"D:\M***e\F***e\TestCookie\ARMSFiles\TextFile.txt";

    IDirectoryContents dirContents = _fileProvider.GetDirectoryContents("ARMSFiles");
    IFileInfo fileInfo = _fileProvider.GetFileInfo("ARMSFiles/TextFile.txt");
    System.Diagnostics.Debug.WriteLine(filePath);
    System.Diagnostics.Debug.WriteLine(fileInfo.LastModified);
    return Ok(fileInfo.LastModified);
}

2. Метод ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    //IFileProvider physicalProvider = new PhysicalFileProvider(Directory.GetParent(env.ContentRootPath).ToString());
    var physicalProvider = _env.ContentRootFileProvider;
    var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());
    var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider);
    services.AddSingleton<IFileProvider>(compositeProvider);
    ...
    services.AddControllersWithViews();

}

3. Настроить метод

app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "ARMSFiles")),
        RequestPath = "/ARMSFiles"
    });

Я понял, что моя проблема заключается в том, что это относительный путь, как только вы инициализируете его при запуске. Я не могу поверить, что пропустил это в документах MS. Итак, наш код теперь такой же, так что это правильный ответ. Однако единственная проблема, с которой я сталкиваюсь, заключается в том, что когда я публикую свое приложение на сервере IIS и использую этот код, дата последнего изменения переносится на 4 часа вперед. Таким образом, даже в IIS, когда я смотрю на файл, он показывает последнее изменение в 13:53, он показывает его как 17:53. Любая причина, по которой это было бы сделано? Отлично работал в визуальной студии локально при тестировании в моей локальной файловой системе.

Bradyboyy88 21.03.2022 18:57

@ Bradyboyy88 Время отличается, очевидно, это вызвано разницей во времени между вашим локальным компьютером и сервером. Возможно, часовой пояс, установленный на вашем компьютере, отличается от часового пояса, установленного на сервере. Самый простой способ — подключиться по телнету к папке на сервере и проверить время последней модификации.

Jason Pan 22.03.2022 02:06

@ Bradyboyy88 Если мое решение вдохновляет или помогает вам, не могли бы вы отметить мой ответ как принятый, спасибо~

Jason Pan 22.03.2022 02:33

Эй, сервер является локальным в моей сети, и при удалении на сервер дата идентична моему компьютеру. Не знаете, почему этот LastModified() возвращает дату через 4 часа? Я принял ваш ответ, но я до сих пор не уверен, почему он это делает.

Bradyboyy88 23.03.2022 01:49

@ Bradyboyy88 может быть, вы можете создать новый пост, если кто-то знаком с проблемой, они вам расскажут

Jason Pan 23.03.2022 01:51

Может быть из-за этого (UTC против LocalTime): docs.microsoft.com/en-us/aspnet/core/migration/…

pcalkins 25.03.2022 19:30

Другие вопросы по теме