| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- using SFB;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Data;
- using System.IO;
- using System.Runtime.InteropServices;
- using UnityEditor;
- using UnityEngine;
- using UnityEngine.Networking;
- #region 调用系统窗口选择文件夹或文件
- public class FileOpMsg
- {
- public bool success;
- public string msg;
- }
- #region 结构体
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- public class OpenDialogFile
- {
- public int structSize = 0;
- public IntPtr dlgOwner = IntPtr.Zero;
- public IntPtr instance = IntPtr.Zero;
- public String filter = null;
- public String customFilter = null;
- public int maxCustFilter = 0;
- public int filterIndex = 0;
- public String file = null;
- public int maxFile = 0;
- public String fileTitle = null;
- public int maxFileTitle = 0;
- public String initialDir = null;
- public String title = null;
- public int flags = 0;
- public short fileOffset = 0;
- public short fileExtension = 0;
- public String defExt = null;
- public IntPtr custData = IntPtr.Zero;
- public IntPtr hook = IntPtr.Zero;
- public String templateName = null;
- public IntPtr reservedPtr = IntPtr.Zero;
- public int reservedInt = 0;
- public int flagsEx = 0;
- }
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- public class OpenDialogDir
- {
- public IntPtr hwndOwner = IntPtr.Zero;
- public IntPtr pidlRoot = IntPtr.Zero;
- public String pszDisplayName = null;
- public String lpszTitle = null;
- public UInt32 ulFlags = 0;
- public IntPtr lpfn = IntPtr.Zero;
- public IntPtr lParam = IntPtr.Zero;
- public int iImage = 0;
- }
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- public class OpenFileName
- {
- public int structSize = 0;
- //public IntPtr hwndOwner = IntPtr.Zero;
- public IntPtr dlgOwner = IntPtr.Zero;
- public IntPtr instance = IntPtr.Zero;
- public String filter = null;
- public String customFilter = null;
- public int maxCustFilter = 0;
- public int filterIndex = 0;
- public String file = null;
- public int maxFile = 0;
- public String fileTitle = null;
- public int maxFileTitle = 0;
- public String initialDir = null;
- public String title = null;
- public int flags = 0;
- public short fileOffset = 0;
- public short fileExtension = 0;
- public String defExt = null;
- public IntPtr custData = IntPtr.Zero;
- public IntPtr hook = IntPtr.Zero;
- public String templateName = null;
- public IntPtr reservedPtr = IntPtr.Zero;
- public int reservedInt = 0;
- public int flagsEx = 0;
- }
- #endregion
- public class FolderBrowserHelper
- {
- #region 引用windows的dll文件
- //[DllImport("user32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
- //private static extern bool ClipCursor([In, Out] Rect rect);
- [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
- private static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
- [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
- private static extern bool GetSaveFileName([In, Out] OpenFileName ofn);
- [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
- private static extern bool GetOpenFileName([In, Out] OpenDialogFile ofn);
- [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
- private static extern bool GetSaveFileName([In, Out] OpenDialogFile ofn);
- [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
- private static extern IntPtr SHBrowseForFolder([In, Out] OpenDialogDir ofn);
- [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
- private static extern bool SHGetPathFromIDList([In] IntPtr pidl, [In, Out] char[] fileName);
- #endregion
- #region 文件操作方法
- public const string IMAGEFILTER = "图片文件(*.jpg;*.png)\0*.jpg;*.png";
- public const string ALLFILTER = "所有文件(*.*)\0*.*";
- /// <summary>
- /// 选择文件
- /// </summary>
- /// <param name="callback">返回选择文件夹的路径</param>
- /// <param name="filter">文件类型筛选器</param>
- public static void SelectFile(Action<FileOpMsg> callback, string filter = ALLFILTER)
- {
- Debug.Log("open 00");
- FileOpMsg fileOpMsg = new FileOpMsg();
- try
- {
- OpenFileName openFileName = new OpenFileName();
- openFileName.structSize = Marshal.SizeOf(openFileName);
- //openFileName.hwndOwner = WindowsTools.ProcessHandle;
- openFileName.filter = filter;
- openFileName.file = new string(new char[256]);
- openFileName.maxFile = openFileName.file.Length;
- openFileName.fileTitle = new string(new char[64]);
- openFileName.maxFileTitle = openFileName.fileTitle.Length;
- openFileName.title = "选择文件";
- openFileName.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000008;
- if (GetSaveFileName(openFileName))
- {
- string filepath = openFileName.file; //选择的文件路径;
- if (File.Exists(filepath))
- {
- fileOpMsg.success = true;
- fileOpMsg.msg = filepath;
- callback?.Invoke(fileOpMsg);
- return;
- }
- }
- }
- catch (Exception e)
- {
- fileOpMsg.success = false;
- fileOpMsg.msg = e.ToString();
- callback?.Invoke(fileOpMsg);
- Debug.LogError(fileOpMsg.msg);
- return;
- }
- fileOpMsg.success = true;
- fileOpMsg.msg = string.Empty;
- callback?.Invoke(fileOpMsg);
- }
- /// <summary>
- /// 调用WindowsExploer并返回所选文件夹路径
- /// </summary>
- /// <param name="dialogtitle">打开对话框的标题</param>
- /// <returns>所选文件夹路径</returns>
- public static string GetPathFromWindowsExplorer(string dialogtitle = "请选择下载路径")
- {
- try
- {
- OpenDialogDir ofn2 = new OpenDialogDir();
- ofn2.pszDisplayName = new string(new char[2048]);// 存放目录路径缓冲区
- ofn2.lpszTitle = dialogtitle; // 标题
- ofn2.ulFlags = 0x00000040; // 新的样式,带编辑框
- IntPtr pidlPtr = SHBrowseForFolder(ofn2);
- char[] charArray = new char[2048];
- for (int i = 0; i < 2048; i++)
- {
- charArray[i] = '\0';
- }
- SHGetPathFromIDList(pidlPtr, charArray);
- string fullDirPath = new string(charArray);
- fullDirPath = fullDirPath.Substring(0, fullDirPath.IndexOf('\0'));
- return fullDirPath;
- }
- catch (Exception e)
- {
- Debug.LogError(e);
- }
- return string.Empty;
- }
- /// <summary>
- /// 选择文件
- /// </summary>
- /// <param name="title"></param>
- /// <param name="directory"></param>
- /// <param name="filterName"></param>
- /// <param name="filterExtensions"></param>
- /// <returns></returns>
- public static string[] SelectFile(string title,string directory,string filterName, params string[] filterExtensions)
- {
- List<ExtensionFilter> extensions = new List<ExtensionFilter>();
- extensions.Add(new ExtensionFilter(filterName, filterExtensions));
- return StandaloneFileBrowser.OpenFilePanel(title,directory, extensions.ToArray(),false);
- }
- /// <summary>
- /// 多选文件
- /// </summary>
- /// <param name="filterName"></param>
- /// <param name="mutiltSelect"></param>
- /// <param name="filterExtensions"></param>
- /// <returns></returns>
- public static List<string> OpenProject(string filterName, bool mutiltSelect, params string[] filterExtensions)
- {
- List<string> list = new List<string>();
- List<ExtensionFilter> extensions = new List<ExtensionFilter>();
- extensions.Add(new ExtensionFilter(filterName, filterExtensions));
- string[] paths = StandaloneFileBrowser.OpenFilePanel(" 上传文件", "", extensions.ToArray(), mutiltSelect);
- foreach (string Wenjian in paths)
- {
- //路径
- string pathName = Path.GetDirectoryName(Wenjian);
- //带扩展名的的指定路径文件名
- string fileName = Path.GetFileName(Wenjian);
- list.Add(pathName + "/" + fileName);
- }
- return list;
- }
- #endregion
- }
- #endregion
|