前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、直接上代码
using System;
using System.Runtime.InteropServices;
/**************************************
日期:#CreateTime#
功能:Nothing
***************************************/
/// <summary>
/// 由于 extern 属性, 导致 只能放在AOT层。
/// </summary>
public class FileTool
{
/// <summary>
/// 保存文件
/// </summary>
/// <param name="fileExtension">文件后缀类型</param>
/// <param name="action"></param>
/// <param name="error"></param>
public static string SaveFolder(string fileExtension,Action error = null)
{
SaveFileDlg pth = new SaveFileDlg();
pth.structSize = Marshal.SizeOf(pth);
pth.dlgOwner = OpenFileDialog.GetForegroundWindow();
pth.filter = $"保存 (*{fileExtension})\0*{fileExtension}\0\0";
pth.file = new string(new char[256]);
pth.maxFile = pth.file.Length;
pth.fileTitle = new string(new char[64]);
pth.maxFileTitle = pth.fileTitle.Length;
pth.initialDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); //默认路径
pth.title = "保存文件";
//pth.dlgOwner =
pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
if (SaveFileDialog.GetSaveFileName(pth))
{
string filepath = pth.file; //选择的文件路径;
return filepath;
}
else
{
if (error != null) error.Invoke();
return "";
}
}
/// <summary>
/// 打开文件
/// </summary>
/// <param name="fileExtension">文件后缀类型</param>
/// <param name="action"></param>
/// <param name="error"></param>
public static string OpenProject(string fileExtension, Action error = null)
{
OpenFileDlg pth = new OpenFileDlg();
pth.dlgOwner = OpenFileDialog.GetForegroundWindow();
pth.structSize = Marshal.SizeOf(pth);
pth.filter = $"加载 (*{fileExtension})\0*{fileExtension}\0\0";
pth.file = new string(new char[256]);
pth.maxFile = pth.file.Length;
pth.fileTitle = new string(new char[64]);
pth.maxFileTitle = pth.fileTitle.Length;
pth.initialDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); //默认路径
pth.title = "打开文件";
pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
if (OpenFileDialog.GetOpenFileName(pth))
{
string filepath = pth.file; //选择的文件路径;
return filepath;
}
else
{
if (error != null) error.Invoke();
return "";
}
}
public static void OpenExe(string filePath,string args)
{
OpenFileDialog.ShellExecute(IntPtr.Zero, "open", filePath, args, "", 1);
}
}
/// <summary>
/// 文件日志类
/// </summary>
// [特性(布局种类.有序,字符集=字符集.自动)]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class ZFileDialog
{
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;
}
/// <summary>
/// 打开文件
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileDlg : ZFileDialog
{
}
/// <summary>
/// 打开文件
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class SaveFileDlg : ZFileDialog
{
}
public class OpenFileDialog
{
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] OpenFileDlg ofd);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern int ShellExecute(IntPtr hwnd, string lpszOp, string lpszFile,
string lpszParams, string lpszDir, int FsShowCmd);
}
/// <summary>
/// 保存文件类
/// </summary>
public class SaveFileDialog
{
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetSaveFileName([In, Out] SaveFileDlg ofd);
}
二、如何使用
//保存文件
var selectPath = FileTool.SaveFolder(".txt");
Debug.Log(selectPath);
//打开文件
var getPath = FileTool.OpenProject(".txt");
Debug.Log(getPath);