File: TempFile.cs
Web Access
Project: src\src\Common\tests\TestUtilities\System.Windows.Forms.Common.TestUtilities.csproj (System.Windows.Forms.Common.TestUtilities)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Runtime.CompilerServices;
 
namespace System.IO;
 
/// <summary>
/// Represents a temporary file. Creating an instance creates a file at the specified path,
/// and disposing the instance deletes the file.
/// </summary>
/// <remarks>
///  <para>
///   This is copied verbatim from TempFile.cs in dotnet/runtime.
///   (https://github.com/dotnet/runtime/blob/master/src/libraries/Common/tests/System/IO/TempFile.cs)
///  </para>
/// </remarks>
public sealed class TempFile : IDisposable
{
    /// <summary>Gets the created file's path.</summary>
    public string Path { get; }
 
    public TempFile(string path, long length = 0) : this(path, length > -1 ? new byte[length] : null)
    {
    }
 
    public TempFile(string path, byte[]? data)
    {
        Path = path;
 
        if (data is not null)
        {
            File.WriteAllBytes(path, data);
        }
    }
 
    public TempFile(string path, string text)
    {
        Path = path;
 
        File.WriteAllText(path, text);
    }
 
    ~TempFile() => DeleteFile();
 
    public static TempFile Create(
        byte[] bytes,
        [CallerMemberName] string? memberName = null,
        [CallerLineNumber] int lineNumber = 0)
        => new(GetFilePath(memberName, lineNumber), bytes);
 
    public static TempFile Create(
        string text,
        [CallerMemberName] string? memberName = null,
        [CallerLineNumber] int lineNumber = 0)
        => new(GetFilePath(memberName, lineNumber), text);
 
    public static TempFile Create(
        long length = -1,
        [CallerMemberName] string? memberName = null,
        [CallerLineNumber] int lineNumber = 0)
        => new(GetFilePath(memberName, lineNumber), length);
 
    public void AssertExists() => Assert.True(File.Exists(Path));
 
    public string ReadAllText() => File.ReadAllText(Path);
 
    public void Dispose()
    {
        GC.SuppressFinalize(this);
        DeleteFile();
    }
 
    private void DeleteFile()
    {
        try
        { File.Delete(Path); }
        catch { /* Ignore exceptions on disposal paths */ }
    }
 
    private static string GetFilePath(string? memberName, int lineNumber)
    {
        string file = $"{IO.Path.GetRandomFileName()}_{memberName}_{lineNumber}";
        return IO.Path.Combine(IO.Path.GetTempPath(), file);
    }
}