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]);//成功
}