// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; namespace System.IO { public partial class FileSystemInfo { private readonly bool _asDirectory; private FileStatus _fileStatus; protected FileSystemInfo() { _asDirectory = this is DirectoryInfo; } internal static FileSystemInfo Create(string fullPath, string fileName, bool asDirectory, ref FileStatus fileStatus) { FileSystemInfo info = asDirectory ? new DirectoryInfo(fullPath, fileName: fileName, isNormalized: true) : new FileInfo(fullPath, fileName: fileName, isNormalized: true); Debug.Assert(!PathInternal.IsPartiallyQualified(fullPath), $"'{fullPath}' should be fully qualified when constructed from directory enumeration"); info.Init(ref fileStatus); return info; } internal void InvalidateCore() => _fileStatus.InvalidateCaches(); internal unsafe void Init(ref FileStatus fileStatus) { _fileStatus = fileStatus; _fileStatus.EnsureCachesInitialized(FullPath); } public FileAttributes Attributes { get => _fileStatus.GetAttributes(FullPath, Name); set => _fileStatus.SetAttributes(FullPath, value, _asDirectory); } internal bool ExistsCore => _fileStatus.GetExists(FullPath, _asDirectory); internal DateTimeOffset CreationTimeCore { get => _fileStatus.GetCreationTime(FullPath); set => _fileStatus.SetCreationTime(FullPath, value, _asDirectory); } internal DateTimeOffset LastAccessTimeCore { get => _fileStatus.GetLastAccessTime(FullPath); set => _fileStatus.SetLastAccessTime(FullPath, value, _asDirectory); } internal DateTimeOffset LastWriteTimeCore { get => _fileStatus.GetLastWriteTime(FullPath); set => _fileStatus.SetLastWriteTime(FullPath, value, _asDirectory); } internal long LengthCore => _fileStatus.GetLength(FullPath); internal UnixFileMode UnixFileModeCore { get => _fileStatus.GetUnixFileMode(FullPath); set => _fileStatus.SetUnixFileMode(FullPath, value); } public void Refresh() { _linkTargetIsValid = false; _fileStatus.RefreshCaches(FullPath); } // There is no special handling for Unix- see Windows code for the reason we do this internal string NormalizedPath => FullPath; } }