При запуске я установил свой 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, что и мой контроллер, поэтому каталоги должны выстраиваться. По сути, это папка за пределами моей корневой папки, поскольку она немного более безопасна, и я использую ее для веб-сайта, когда фактически развертываю ее.
путь к файлу — это полный путь к файлу, поэтому C:\inetpub\files\sampledoc.docx
@ Джейсон Пэн Есть идеи?
Я проверил использование _fileProvider
в моем регионе, и он работает хорошо. Если файл не существует, значение LastModified
равно 01/01/0001
должно быть ожидаемым поведением.
FileProvider использует пути к файлам относительный; в конце концов, это корневая виртуальная файловая система. И вам, как правило, не следует выходить за пределы корневой папки веб-приложений, что вы, похоже, и делаете. Проблема только с LastModified или со всем (как я подозреваю)? Имеет ли пользователь вашего приложения доступ к папке с файлами? Это работает, когда вы не используете файловый провайдер? Почему вы создаете поставщика файлов в родитель корневого пути вашего контента?
Проблема заключалась в относительном пути, как вы указали. Я использовал absolute в параметре GetFileInfo(), что было неправильно, поэтому файла там не было. Судя по вашему комментарию, это плохая практика, даже если у меня есть сервер webdav, работающий на IIS? Я решил, что лучше всего сделать папку webdav вне папки wwwroot, так как это относится к веб-серверу. Он также установлен как виртуальный путь, но я не могу вспомнить, почему именно это сделал, лол. Прошло некоторое время с тех пор, как я установил это.
Я использую приведенный ниже код и получаю значение 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 Время отличается, очевидно, это вызвано разницей во времени между вашим локальным компьютером и сервером. Возможно, часовой пояс, установленный на вашем компьютере, отличается от часового пояса, установленного на сервере. Самый простой способ — подключиться по телнету к папке на сервере и проверить время последней модификации.
@ Bradyboyy88 Если мое решение вдохновляет или помогает вам, не могли бы вы отметить мой ответ как принятый, спасибо~
Эй, сервер является локальным в моей сети, и при удалении на сервер дата идентична моему компьютеру. Не знаете, почему этот LastModified() возвращает дату через 4 часа? Я принял ваш ответ, но я до сих пор не уверен, почему он это делает.
@ Bradyboyy88 может быть, вы можете создать новый пост, если кто-то знаком с проблемой, они вам расскажут
Может быть из-за этого (UTC против LocalTime): docs.microsoft.com/en-us/aspnet/core/migration/…
filePath
этоfolder
илиfile
?