miduo_client/Assets/Scripts/Editor/Util/ProcessUtil.cs

189 lines
7.8 KiB
C#
Raw Normal View History

2021-05-31 11:24:20 +08:00
using UnityEngine;
using UnityEditor;
using System.IO;
2021-06-03 21:32:44 +08:00
using System;
using System.Runtime.InteropServices;
2021-05-31 11:24:20 +08:00
namespace GameEditor.Util
{
2021-06-03 21:32:44 +08:00
/*C#C/C++DLLLayoutKindSequentialExplicit
SequentialExplicitFieldOffset()
使CharSet=CharSet.Ansi
*/
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct OpenFileName
{
public int structSize; //结构的内存大小
public IntPtr dlgOwner; //设置对话框的句柄
public IntPtr instance; //根据flags标志的设置确定instance是谁的句柄不设置则忽略
public string filter; //调取文件的过滤方式
public string customFilter; //一个静态缓冲区 用来保存用户选择的筛选器模式
public int maxCustFilter; //缓冲区的大小
public int filterIndex; //指向的缓冲区包含定义过滤器的字符串对
public string file; //存储调取文件路径
public int maxFile; //存储调取文件路径的最大长度 至少256
public string fileTitle; //调取的文件名带拓展名
public int maxFileTitle; //调取文件名最大长度
public string initialDir; //最初目录
public string title; //打开窗口的名字
public int flags; //初始化对话框的一组位标志 参数类型和作用查阅官方API
public short fileOffset; //文件名前的长度
public short fileExtension; //拓展名前的长度
public string defExt; //默认的拓展名
public IntPtr custData; //传递给lpfnHook成员标识的钩子子程的应用程序定义的数据
public IntPtr hook; //指向钩子的指针。除非Flags成员包含OFN_ENABLEHOOK标志否则该成员将被忽略。
public string templateName; //模块中由hInstance成员标识的对话框模板资源的名称
public IntPtr reservedPtr;
public int reservedInt;
public int flagsEx; //可用于初始化对话框的一组位标志
}
public class WindowDll
{
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
}
2021-05-31 11:24:20 +08:00
public static class ProcessUtil
{
//
public static void ProcessCommand(string dir, string com, bool isShowWindow = false)
{
ProcessCommand(dir, new string[] { com }, isShowWindow);
}
public static void ProcessCommand(string dir, string[] coms, bool isShowWindow = false)
{
#if UNITY_IOS
string shellPath = Path.Combine(dir, "coms.sh");
if (!File.Exists(shellPath))
{
File.Create(shellPath).Close();
}
File.WriteAllLines(shellPath, coms);
using(System.Diagnostics.Process p = new System.Diagnostics.Process())
{
//设置要启动的应用程序
p.StartInfo.FileName = "/bin/zsh";
//是否使用操作系统shell启动
p.StartInfo.UseShellExecute = false;
//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardInput = false;
//输出信息
p.StartInfo.RedirectStandardOutput = false;
//输出错误
p.StartInfo.RedirectStandardError = false;
//不显示程序窗口
p.StartInfo.CreateNoWindow = !isShowWindow;
//设置文件夹
p.StartInfo.WorkingDirectory = dir;
p.StartInfo.Arguments = shellPath;
//启动程序
p.Start();
//等待程序执行完退出进程
p.WaitForExit();
//关闭
p.Close();
//删除命令行文件
File.Delete(shellPath);
}
#else
2021-05-31 11:24:20 +08:00
System.Diagnostics.Process p = new System.Diagnostics.Process();
//设置要启动的应用程序
p.StartInfo.FileName = "cmd.exe";
//是否使用操作系统shell启动
p.StartInfo.UseShellExecute = false;
//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardInput = false;
//输出信息
p.StartInfo.RedirectStandardOutput = false;
//输出错误
p.StartInfo.RedirectStandardError = false;
//不显示程序窗口
p.StartInfo.CreateNoWindow = !isShowWindow;
// 设置文件夹
p.StartInfo.WorkingDirectory = dir;
// 执行命令
for (int i = 0; i < coms.Length; i++)
{
p.StartInfo.Arguments = "/k " + coms[i] + "&exit";
//启动程序
p.Start();
//等待程序执行完退出进程
p.WaitForExit();
}
//p.StartInfo.Arguments = "/k exit";
////启动程序
//p.Start();
//等待程序执行完退出进程
//p.WaitForExit();
p.Close();
#endif
2021-05-31 11:24:20 +08:00
}
// 打开文本
public static void OpenText(string tPath)
{
if (!File.Exists(tPath))
{
EditorUtility.DisplayDialog("提示", "文件不存在", "确定");
return;
}
#if PLATFORM_IOS
ProcessCommand(Application.dataPath, "open " + tPath); //用记事本
#else
2021-05-31 11:24:20 +08:00
System.Diagnostics.Process.Start("notepad.exe", tPath); //用记事本
#endif
2021-05-31 11:24:20 +08:00
}
//返回 数组第一个是文件夹路径 ,以后的是文件名字
public static string[] OpenFileWin(string path,string ext = "*.*")
2021-06-03 21:32:44 +08:00
{
//初始化
OpenFileName ofn = new OpenFileName();
ofn.structSize = Marshal.SizeOf(ofn);
ofn.filter = "All Files\0*.*\0\0";
ofn.file = new string(new char[1024]);
ofn.maxFile = ofn.file.Length;
ofn.fileTitle = new string(new char[64]);
ofn.maxFileTitle = ofn.fileTitle.Length;
path = path.Replace('/', '\\');
ofn.initialDir = path; //默认路径
ofn.title = "Open Project";
ofn.defExt = ext;//显示文件的类型
2021-06-03 21:32:44 +08:00
//注意 一下项目不一定要全选 但是0x00000008项不要缺少
ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
string[] strs = null;
//判断是否打开文件
if (WindowDll.GetOpenFileName(ofn))
{
//多选文件
string[] Splitstr = { "\0" };
string[] strs1 = ofn.file.Split(Splitstr, StringSplitOptions.RemoveEmptyEntries);
if (strs1.Length == 1)
{
strs = new string[] { Path.GetDirectoryName(strs1[0]), Path.GetFileName(strs1[0]) };
}
else
{
strs = strs1;
}
2021-06-03 21:32:44 +08:00
}
else
{
Debug.LogFormat("路径为空");
}
2021-06-03 21:32:44 +08:00
return strs;
}
2021-05-31 11:24:20 +08:00
}
}