Unity 从任意位置读取CSV文件(Windows平台)

1.打开Windows弹出窗口选择文件读取
(此部分参考
原文链接1
原文链接2
详细OpenFileName参数)

创建打开窗口和保存窗口的类。

[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 static bool GetOFN([In, Out] OpenFileDlg ofn)
        {
            return GetOpenFileName(ofn);
        }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class SaveFileDlg : FileDlg
    {

    }
    public class SaveFileDialog {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool GetSaveFileName([In, Out] SaveFileDlg ofd);
        public static bool GetSFN([In, Out] SaveFileDlg ofn)
        {
            return GetSaveFileName(ofn);
        }
    }

调用刚才创建的类,通过按钮打开弹窗选择CSV文件。

void OnClick()
    {
        OpenFileDlg pth = new OpenFileDlg();
        pth.structSize = Marshal.SizeOf(pth);
        pth.filter = "CSV文件(*.csv)\0*.csv";
        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;  // default path  
        pth.title = "打开项目";
        pth.defExt = "csv";
        pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
        if (OpenFileDialog.GetOpenFileName(pth))
        {
            string filepath = pth.file;//选择的文件路径;  
            Debug.Log(filepath);
        }
    }

2.Unity读取文件必须将文件放入到Assets的StreamingAssets文件夹中(如没有请手动创建),因此需要将所选择的CSV文件自动复制到StreamingAssets文件夹中。
(此部分参考链接)

void CopyFolder(string filepath, string desPath)
    {
          if (!Directory.Exists(desPath))
          {
              try
              {
                  Directory.CreateDirectory(desPath);
              }
              catch(Exception e)
              {
                  throw new Exception("创建目标目录失败:" + e.Message);
              }
          }
          string desFile = Path.Combine(desPath, Path.GetFileName(filepath));
          File.Copy(filepath, desFile, true);
    }

3.读取CSV文件,因为CSV文件为按逗号分隔,因此需要注意数据中含逗号的情况
(此部分参考链接)

因此总体步骤代码如下:

if (OpenFileDialog.GetOpenFileName(pth))
        {
            string filepath = pth.file;//选择的文件路径;  
            string desPath = Application.streamingAssetsPath;//StreamingAssets路径
            CopyFolder(filepath, desPath);//需移动复制到streamingAssets文件夹中
            List<List<string>> lists = CSVTool.Read(Application.streamingAssetsPath + "/" + Path.GetFileName(filepath), Encoding.Default);//读取CSV文件
            Debug.Log(lists[0][0]);//成功
        }

你可能感兴趣的:(Unity,读取资源)