123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Runtime.InteropServices;
- using UnityEngine;
- namespace TFramework
- {
- public class SystemFileTools
- {
- #region OpenFile数据接收类
- [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 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 static class FolderBrowserHelper
- {
- #region Window
- [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
- public const string IMAGEFILTER = "图片文件(*.jpg;*.png)\0*.jpg;*.png";
- public const string ALLFILTER = "所有文件(*.*)\0*.*";
- /// <summary>
- /// 选择文件返回文件路径
- /// </summary>
- /// <param name="filter">文件类型筛选器</param>
- public static string SelectFile(string filter = ALLFILTER)
- {
- try
- {
- OpenFileName openFileName = new OpenFileName();
- openFileName.structSize = Marshal.SizeOf(openFileName);
- openFileName.initialDir = Application.streamingAssetsPath.Replace('/', '\\');
- 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))
- {
- return filepath;
- }
- }
- }
- catch (Exception e)
- {
- Debug.LogError(e);
- }
- return "";
- }
- /// <summary>
- /// 返回所选文件夹路径
- /// </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;
- ofn2.ulFlags = 0x00080000; // 新的样式,带编辑框
- IntPtr pidlPtr = SHBrowseForFolder(ofn2);
- char[] charArray = new char[2048];
- for (int i = 0; i < 2048; i++)
- {
- charArray[i] = '\0';
- }
- SHGetPathFromIDList(pidlPtr, charArray);
- string res = new string(charArray);
- res = res.Substring(0, res.IndexOf('\0'));
- return res;
- }
- catch (Exception e)
- {
- Debug.LogError(e);
- }
- return string.Empty;
- }
- public static void CopyDirectory(string srcPath, string destPath)
- {
- try
- {
- DirectoryInfo dir = new DirectoryInfo(srcPath);
- FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //获取目录下(不包含子目录)的文件和子目录
- foreach (FileSystemInfo i in fileinfo)
- {
- if (i is DirectoryInfo) //判断是否文件夹
- {
- if (!Directory.Exists(destPath + "\\" + i.Name))
- {
- Directory.CreateDirectory(destPath + "\\" + i.Name); //目标目录下不存在此文件夹即创建子文件夹
- }
- CopyDirectory(i.FullName, destPath + "\\" + i.Name); //递归调用复制子文件夹
- }
- else
- {
- File.Copy(i.FullName, destPath + "\\" + i.Name, true); //不是文件夹即复制文件,true表示可以覆盖同名文件
- }
- }
- }
- catch (Exception e)
- {
- throw;
- }
- }
- }
- }
- }
|