File: FileProviderRazorProjectItem.cs
Web Access
Project: src\src\Mvc\Mvc.Razor.RuntimeCompilation\src\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.csproj (Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.Extensions.FileProviders;
 
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
 
/// <summary>
/// A file provider <see cref="RazorProjectItem"/>.
/// </summary>
[Obsolete("Razor runtime compilation is obsolete and is not recommended for production scenarios. For production scenarios, use the default build time compilation. For development scenarios, use Hot Reload instead. For more information, visit https://aka.ms/aspnet/deprecate/003.", DiagnosticId = "ASPDEPR003")]
public class FileProviderRazorProjectItem : RazorProjectItem
{
    private readonly string _root;
    private string? _relativePhysicalPath;
    private bool _isRelativePhysicalPathSet;
 
    /// <summary>
    /// Intializes a new instance of a <see cref="FileProviderRazorProjectItem"/>.
    /// </summary>
    /// <param name="fileInfo">The file info.</param>
    /// <param name="basePath">The base path.</param>
    /// <param name="filePath">The file path.</param>
    /// <param name="root">The root.</param>
    public FileProviderRazorProjectItem(IFileInfo fileInfo, string basePath, string filePath, string root) : this(fileInfo, basePath, filePath, root, fileKind: null)
    {
    }
 
    /// <summary>
    /// Intializes a new instance of a <see cref="FileProviderRazorProjectItem"/>.
    /// </summary>
    /// <param name="fileInfo">The file info.</param>
    /// <param name="basePath">The base path.</param>
    /// <param name="filePath">The file path.</param>
    /// <param name="root">The root.</param>
    /// <param name="fileKind">The kind of file.</param>
    public FileProviderRazorProjectItem(IFileInfo fileInfo, string basePath, string filePath, string root, string? fileKind)
    {
        FileInfo = fileInfo;
        BasePath = basePath;
        FilePath = filePath;
        FileKind = fileKind ?? FileKinds.GetFileKindFromFilePath(filePath);
        _root = root;
    }
 
    /// <summary>
    /// The <see cref="IFileInfo"/>.
    /// </summary>
    public IFileInfo FileInfo { get; }
 
    /// <inheritdoc/>
    public override string BasePath { get; }
 
    /// <inheritdoc/>
    public override string FilePath { get; }
 
    /// <inheritdoc/>
    public override string FileKind { get; }
 
    /// <inheritdoc/>
    public override bool Exists => FileInfo.Exists;
 
    /// <inheritdoc/>
    public override string PhysicalPath => FileInfo.PhysicalPath ?? string.Empty;
 
    /// <inheritdoc/>
    public override string? RelativePhysicalPath
    {
        get
        {
            if (!_isRelativePhysicalPathSet)
            {
                _isRelativePhysicalPathSet = true;
 
                if (Exists)
                {
                    if (_root != null &&
                        !string.IsNullOrEmpty(PhysicalPath) &&
                        PhysicalPath.StartsWith(_root, StringComparison.OrdinalIgnoreCase) &&
                        PhysicalPath.Length > _root.Length &&
                        (PhysicalPath[_root.Length] == Path.DirectorySeparatorChar || PhysicalPath[_root.Length] == Path.AltDirectorySeparatorChar))
                    {
                        _relativePhysicalPath = PhysicalPath.Substring(_root.Length + 1); // Include leading separator
                    }
                }
            }
 
            return _relativePhysicalPath;
        }
    }
 
    /// <inheritdoc/>
    public override Stream Read()
    {
        return FileInfo.CreateReadStream();
    }
}