虽然Silverlight已经是被抛弃的孩子了,但此前做的一些项目还是用到Silverlight。今天用Silverlight导入客户端本地的一个txt文件,然后读取需要的信息。随手记录一下,留作以后备忘。
网上也有不少的相关资料,但好像要么是单纯的Ctrl+C、Ctrl+V,要么是不够齐全。闲话少说,直接上代码。
我用的是MVVM模式,所以用RelayCommand命令打开了。其它的,直接在类似Button_Click事件里调用OpenFile(),同理。
/// <summary> /// 打开文件 /// </summary> private void OpenFile() { try { //检查是否是在OOB模式下运行 OOBChecker.CheckInstallState(() => { //弹出选择文件对话框 OpenFileDialog fileDialog = new OpenFileDialog() { Filter = "Txt Files (*.txt)|*.txt|All Files (*.*)|*.*",}; if (fileDialog.ShowDialog() == true) { //读取文件流 using (Stream fs = fileDialog.File.OpenRead()) { ReadTxtFile(fs); fs.Close(); } } }); } catch (Exception e) { //错误处理 } }
注: OOBChecker.CheckInstallState,是为公司项目需要写的一个检查Silverlight程序是否在浏览器外运行的方法。众所周知,Silverlight是可以安装在本机脱离浏览器运行的,这样便可获得更高的执行权限。有时对本地文件(夹)进行操作时,程序需要获得信任权限。不知是否我浏览器设置问题,我直接在IE上运行,貌似也有权限。
附上OOBChecker的代码。
OpenFile方法中,调用了一个读取文件内容的方法:ReadTxtFile
/// <summary> /// 一行行地循环读取 /// </summary> private void ReadTxtFile(Stream fs) { var myTable = new List<string>(); using (StreamReader reader = new StreamReader(fs,new Gb2312Encoding())) { /* * 一次性读出所有文件信息 * var fileText = string.Empty; fileText = reader.ReadToEnd(); */ reader.BaseStream.Seek(0,SeekOrigin.Begin); string strLine = reader.ReadLine(); var tableIndex = 0; while (strLine != null) { /* * do your things here if (strLine.Contains("[Your message is here]")) { //找到表头了 tableIndex++; } if (tableIndex > 6) { //读完需要的表信息了,跳出 break; } if (tableIndex >= 4) { //开始获取需要的信息 myTable.Add(strLine); } if (tableIndex > 0) { tableIndex++; } */ strLine = reader.ReadLine(); } reader.Close(); } if (myTable.Any()) { foreach (var strItem in myTable) { var view = strItem.TrimEnd('\t').Split('\t'); //do something here } } }
注:Silverlight不支持GB2312编码,所以打开中文时会乱码。为此,我们可以继承Encoding,自己为程序添加GB2312编码。然后像下面那样调用。
StreamReader reader = new StreamReader(fs,new Gb2312Encoding())
Gb2312Encoding的代码,里面包含了个Gb2312toUnicodeDictinary(这个是网上找的,很多网上资料只有Gb2312Encoding,却没有附上Gb2312toUnicodeDictinary)。 只上Gb2312Encoding的代码吧,Gb2312toUnicodeDictinary有7000多行的说……,这两个文件以附件形式放在后面,有需要的童鞋自行下载。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。