在window平台下,有时我们需要打开或则保存一些文件到指定目录下,这时我们不需要再重复造轮子,完全可以调用系统的文件窗口,然而由于在Unity 中是无法直接使用 C# 提供的 OpenFileDialog 与 FolderBrowserDialog 类来打开文件夹对话框。下面来将文件打开窗口和保存窗口进行封装一下,具体的调用如下:
文件日志类
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using System;
namespace Common
{
//[特性(布局种类、有序、字符集、自动)]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class FileDlg
{
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 OpenFileDlg : FileDlg
{
}
public class OpenFileDialog
{
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] OpenFileDlg ofd);
}
public class SaveFileDialog
{
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetSaveFileName([In, Out] SaveFileDlg ofd);
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class SaveFileDlg : FileDlg
{
}
}
打开/保存文件至文件夹 工具类直接调用
namespace Common
{
public class FileControllerUtls
{
private static FileControllerUtls instance;
public static FileControllerUtls Instance
{
get
{
if (Instance == null)
instance = new FileControllerUtls();
return Instance;
}
}
private string fileName;//保存文件的文件名
public string FileName { get { return fileName; } set { fileName = value; } }
/// <summary>
/// 保存文件
/// </summary>
public void SaveProject()
{
SaveFileDlg pth = new SaveFileDlg();
pth.structSize = System.Runtime.InteropServices.Marshal.SizeOf(pth);
pth.filter = "json (*.json)";//文件类型
pth.file = new string(new char[256]);
pth.maxFile = pth.file.Length;
pth.file = fileName;//保存文件的默认名字
//fileName就是默认值, pth.file = fileName这个语句需要放在 pth.maxFile = pth.file.Length语句后面,要不然会一直报错。
pth.fileTitle = new string(new char[64]);
pth.maxFileTitle = pth.fileTitle.Length;
pth.initialDir = Application.dataPath; // 文件的默认保存路径
pth.title = "保存文件";//
pth.defExt = "json";
pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
if (SaveFileDialog.GetSaveFileName(pth))
{
string filepath = pth.file;//选择需要保存的文件路径;
filepath = filepath.Replace('\\', '/');
}
}
/// <summary>
/// 打开文件
/// </summary>
public void OpenProject()
{
OpenFileDlg pth = new OpenFileDlg();
pth.structSize = System.Runtime.InteropServices.Marshal.SizeOf(pth);
pth.filter = "txt (*.txt)";
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 = Application.dataPath; // 默认路径
pth.title = "打开文件";
pth.defExt = "txt";
pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
//0x00080000 是否使用新版文件选择窗口
//0x00000200 是否可以多选文件
if (OpenFileDialog.GetOpenFileName(pth))
{
string filepath = pth.file;//选择需要打开的文件路径;
Debug.Log(filepath);
}
}
}
}