您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

123 行
3.7 KiB

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
namespace ConnectedGames.Build
{
class BuildZip
{
string m_SrcPath;
string m_DstPath;
Process m_Process;
int m_Progress;
Stopwatch m_Timer = new Stopwatch();
string m_Platform;
// NOTE: Zipping doesn't use label, this is only here in case this zip is supposed to be uploaded
// then the label will be used in the upload call
string m_Label;
public long ElapsedTime
{
get { return m_Timer.ElapsedMilliseconds / 1000; }
}
public int Progress
{
get { return m_Progress; }
}
public string FileName
{
get { return m_DstPath; }
}
public string Platform
{
get { return m_Platform; }
}
public string Label
{
get { return m_Label; }
}
public bool IsDone
{
get
{
UnityEngine.Debug.Assert(m_Process != null);
return m_Process.HasExited;
}
}
public BuildZip(string srcPath, string dstPath, string platform, string label)
{
m_SrcPath = srcPath;
m_DstPath = dstPath;
m_Platform = platform;
m_Label = label;
}
public bool StartZip()
{
if (File.Exists(m_DstPath))
{
File.Delete(m_DstPath);
}
var arguments = new StringBuilder();
arguments.Append("a -bsp1 -bb3 -bt -mx1 \""); //a -y -r -bsp1 -bse1 -bso1 {0} {1} -mx9
arguments.Append(m_DstPath);
arguments.Append("\" ");
arguments.Append("\"" + m_SrcPath + "\" ");
return Run7Zip("", arguments.ToString());
}
// TODO: On mac this process seems to hang for a long time sometimes
// When that happens and there is a domain reload it loses the "upload
// after compress" state and it never happens (also progress bar is never cleared)
bool Run7Zip(string workingDir, string arguments)
{
Regex REX_SevenZipStatus = new Regex(@"(?<p>[0-9]+)%");
//Debug.Log("Args: " + arguments);
var processName = "7za";
if (Application.platform == RuntimePlatform.WindowsEditor)
processName = "7z.exe";
m_Process = new Process();
m_Process.StartInfo.FileName = (UnityEditor.EditorApplication.applicationContentsPath + "/Tools/" + processName);
m_Process.StartInfo.Arguments = arguments;
m_Process.StartInfo.UseShellExecute = false;
m_Process.StartInfo.WorkingDirectory = workingDir;
m_Process.StartInfo.CreateNoWindow = true;
m_Process.StartInfo.RedirectStandardOutput = true;
m_Process.OutputDataReceived += (sender, e) =>
{
if (!String.IsNullOrEmpty(e.Data))
{
Match m = REX_SevenZipStatus.Match(e.Data ?? "");
if (m != null && m.Success)
{
m_Progress = int.Parse(m.Groups["p"].Value);
}
}
};
m_Process.Exited += (obj, e) =>
{
UnityEngine.Debug.Log("Compression done in " + ElapsedTime);
m_Timer.Stop();
};
m_Timer.Start();
bool ret = m_Process.Start();
if(ret)
m_Process.BeginOutputReadLine();
return ret;
}
}
}