Unity 调用系统文件窗口进行打开文件和保存文件

在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);
            }
        }
    }
}

窗口 样式

在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗夜__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值