using XGame.Framework.Asyncs;
using System;
using UnityEngine.Networking;
namespace XGame.Framework.FileSystem
{
//internal enum ECopyMode
//{
// ///
// /// 包外->包外
// ///
// OUTSIDE_TO_OUTSIDE,
// ///
// /// 包内->包外
// ///
// INNERASSETS_TO_OUTSIDE
//}
internal sealed class CopyFileAsync : Async, ICopyFileAsync
{
bool overwrite;
public bool Success { get; private set; }
public string From { get; private set; }
public string To { get; private set; }
public CopyFileAsync(string source, string destination, bool overwrite)
{
From = source;
To = destination;
Success = false;
this.overwrite = overwrite;
}
public void Start()
{
if (string.IsNullOrEmpty(From))
{
Success = false;
Exception = new Exception($"源文件路径为空...");
Completed();
return;
}
WebRequestCopyFile();
}
private void WebRequestCopyFile()
{
var uri = new Uri(From);
var request = UnityWebRequest.Get(uri);
var operation = request.SendWebRequest();
operation.completed += (op) =>
{
var bRet = request.result == UnityWebRequest.Result.Success && string.IsNullOrEmpty(request.error);
if (bRet)
{
try
{
var toDir = System.IO.Path.GetDirectoryName(To);
if (!System.IO.Directory.Exists(toDir))
{
System.IO.Directory.CreateDirectory(toDir);
}
System.IO.File.WriteAllBytes(To, request.downloadHandler.data);
}
catch (Exception ex)
{
OnThreadCompleted(new CopyThreadContext(false, ex));
return;
}
}
else
{
Log.Error($"CopyFileAsync failed. From:{From} To:{To} UnityWebRequest Result:{request.result} Error:{request.error}");
}
OnThreadCompleted(new CopyThreadContext(bRet, null));
};
}
private void OnThreadCompleted(object obj)
{
var context = (CopyThreadContext)obj;
Exception = context.Exception;
Success = context.Success;
Completed();
}
struct CopyThreadContext
{
public bool Success { get; }
public Exception Exception { get; }
public CopyThreadContext(bool success, Exception exception)
{
Success = success;
Exception = exception;
}
}
}
}