| File: EmbeddedResourceFileInfo.cs | Web Access |
| Project: src\aspnetcore\src\FileProviders\Embedded\src\Microsoft.Extensions.FileProviders.Embedded.csproj (Microsoft.Extensions.FileProviders.Embedded) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.IO; using System.Reflection; namespace Microsoft.Extensions.FileProviders.Embedded; /// <summary> /// Represents a file embedded in an assembly. /// </summary> public class EmbeddedResourceFileInfo : IFileInfo { private readonly Assembly _assembly; private readonly string _resourcePath; private long? _length; /// <summary> /// Initializes a new instance of <see cref="EmbeddedFileProvider"/> for an assembly using <paramref name="resourcePath"/> as the base /// </summary> /// <param name="assembly">The assembly that contains the embedded resource</param> /// <param name="resourcePath">The path to the embedded resource</param> /// <param name="name">An arbitrary name for this instance</param> /// <param name="lastModified">The <see cref="DateTimeOffset" /> to use for <see cref="LastModified" /></param> public EmbeddedResourceFileInfo( Assembly assembly, string resourcePath, string name, DateTimeOffset lastModified) { _assembly = assembly; _resourcePath = resourcePath; Name = name; LastModified = lastModified; } /// <summary> /// Always true. /// </summary> public bool Exists => true; /// <summary> /// The length, in bytes, of the embedded resource /// </summary> public long Length { get { if (!_length.HasValue) { using var stream = GetManifestResourceStream(); _length = stream.Length; } return _length.Value; } } /// <summary> /// Always null. /// </summary> public string? PhysicalPath => null; /// <summary> /// The name of embedded file /// </summary> public string Name { get; } /// <summary> /// The time, in UTC, when the <see cref="EmbeddedFileProvider"/> was created /// </summary> public DateTimeOffset LastModified { get; } /// <summary> /// Always false. /// </summary> public bool IsDirectory => false; /// <inheritdoc /> public Stream CreateReadStream() { var stream = GetManifestResourceStream(); if (!_length.HasValue) { _length = stream.Length; } return stream; } private Stream GetManifestResourceStream() { var stream = _assembly.GetManifestResourceStream(_resourcePath); if (stream == null) { throw new InvalidOperationException($"Couldn't get resource at '{_resourcePath}'."); } return stream; } }