File: src\libraries\System.Private.CoreLib\src\System\IO\FileSystemInfo.Unix.cs
Web Access
Project: src\src\coreclr\System.Private.CoreLib\System.Private.CoreLib.csproj (System.Private.CoreLib)
// 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;
    }
}