File: src\tasks\Common\ProxyFile.cs
Web Access
Project: src\src\tasks\AotCompilerTask\MonoAOTCompiler.csproj (MonoAOTCompiler)
// 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.Collections.Generic;
using System.Collections.Concurrent;
using System.IO;
using System.Text.Json;
using Microsoft.Build.Framework;
 
#nullable enable
 
internal sealed class ProxyFile
{
    public string TargetFile { get; }
    public string TempFile   { get; }
    private FileCache _cache;
 
    public ProxyFile(string targetFile, FileCache cache)
    {
        _cache = cache;
        this.TargetFile = targetFile;
        this.TempFile = _cache.Enabled ? targetFile + ".tmp" : targetFile;
    }
 
    public bool CopyOutputFileIfChanged()
    {
        if (!_cache.Enabled)
            return true;
 
        if (!File.Exists(TempFile))
            throw new LogAsErrorException($"Could not find the temporary file {TempFile} for target file {TargetFile}. Look for any errors/warnings generated earlier in the build.");
 
        try
        {
            if (!_cache.ShouldCopy(this, out string? cause))
            {
                _cache.Log.LogMessage(MessageImportance.Low, $"Skipping copying over {TargetFile} as the contents are unchanged");
                return false;
            }
 
            if (File.Exists(TargetFile))
                File.Delete(TargetFile);
 
            File.Copy(TempFile, TargetFile);
 
            _cache.Log.LogMessage(MessageImportance.Low, $"Copying {TempFile} to {TargetFile} because {cause}");
            return true;
        }
        finally
        {
            _cache.Log.LogMessage(MessageImportance.Low, $"Deleting temp file {TempFile}");
            File.Delete(TempFile);
        }
    }
}