WuhuIslandTesting/Library/PackageCache/com.unity.scriptablebuildpipeline@1.21.5/Editor/CacheServer/FileDownloadItem.cs

83 lines
2.6 KiB
C#
Raw Permalink Normal View History

2025-01-07 02:06:59 +01:00
using System;
using System.IO;
using UnityEngine;
namespace UnityEditor.Build.CacheServer
{
/// <summary>
/// IDownloadItem implementation for downloading to a file specified by path.
/// </summary>
public class FileDownloadItem : IDownloadItem
{
private Stream m_writeStream;
private string m_tmpPath;
/// <summary>
/// The FileId for the FileDownloadItem. FileId consists of an assets guid and hash code.
/// </summary>
public FileId Id { get; private set; }
/// <summary>
/// The type of the FileDownloadItems desired item.
/// </summary>
public FileType Type { get; private set; }
/// <summary>
/// File path where downloaded file data is saved. Data is first written to a temporary file location, and moved
/// into place when the Finish() method is called by the Cache Server Client.
/// </summary>
public string FilePath { get; private set; }
/// <summary>
/// Gets the write stream for a given FileDownloadItem. If one does not exist, it will be created.
/// </summary>
/// <param name="size"></param>
/// <returns></returns>
public Stream GetWriteStream(long size)
{
if (m_writeStream == null)
{
m_tmpPath = Path.GetTempFileName();
m_writeStream = new FileStream(m_tmpPath, FileMode.Create, FileAccess.Write);
}
return m_writeStream;
}
/// <summary>
/// Create a new FileDownloadItem
/// </summary>
/// <param name="fileId">The FileId of the desired item.</param>
/// <param name="fileType">The FileType of the desired item.</param>
/// <param name="path">The path of the desired item.</param>
public FileDownloadItem(FileId fileId, FileType fileType, string path)
{
Id = fileId;
Type = fileType;
FilePath = path;
}
/// <summary>
/// Dispose the FileDownloadItems write stream and move the data from the temporary path to its final destination.
/// </summary>
public void Finish()
{
if (m_writeStream == null)
return;
m_writeStream.Dispose();
try
{
if (File.Exists(FilePath))
File.Delete(FilePath);
File.Move(m_tmpPath, FilePath);
}
catch (Exception e)
{
Debug.LogError(e);
}
}
}
}