【Win 10 应用开发】文件读写的三种方案
本文老周就跟伙伴们探讨一下关于文件读写的方法。总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好。反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上。
OK,咱们开始吧。
先说第一个方案:使用 FileIO类。
这个类属于RT库API,它公开了一堆静态方法,可以直接调用,快捷方便,就像.net里面的File类一样。在使用FileIo类的时候,需要一个引用已知文件的StorageFile实例,而且FileIo只能操作已经存在的文件,它不会自动创建文件,这一点要注意。
下面代码演示如何用FileIO类把文本内容写入文件中。
// 获取文档库
StorageFolder doclib = KnownFolders.DocumentsLibrary;
// 创建新文件
StorageFile newfile = await doclib.CreateFileAsync("test.txt", CreationCollisionOption.OpenIfExists); // 将文本写入文件
await FileIO.WriteTextAsync(newfile, content, UnicodeEncoding.Utf8);
在读写文本的时候,强烈建议明确指定为UTF-8编码,这样做可以减少灵异事件发生的概率,信不信由你。
在调用CreateFileAsync方法创建新文件时,可以同时只定一个CreationCollisionOption枚举的值,如果值为FailIfExists,表示当文件已经存在时会引发异常;我这里选用OpenIfExists,即如果文件不存在就创建,如果存在就打开现有文件;如果值为ReplaceExisting,就替换现有文件。
下面代码读从刚才保存的文件中将文本读出来。
try
{
// 访问文档库
StorageFolder doclib = KnownFolders.DocumentsLibrary;
// 获取刚才保存的文件
StorageFile file = await doclib.GetFileAsync(filename); if (file != null)
{
// 读入内容
displayContent = await FileIO.ReadTextAsync(file, UnicodeEncoding.Utf8);
}
}
catch (FileNotFoundException)
{
displayContent = "文件不存在。";
}
catch (Exception ex)
{
displayContent = ex.Message;
}
如果要打开的文件不存在,会引发FileNotFoundException异常,所以我特特地捕捉这个异常,为的是在文件不存在时向用户反馈。
这里有个关键点,大家要记清,你写入文本时用的是Utf-8编码,在读出来的时候也要使用匹配的编码格式,在民政局登记领证时,你总不能写别人家老婆的名字吧。
第二种方案用的也是RT库的API,即DataWriter和DataReader类。这与FileIO还是有不同的,FileIO所针对的文件对象,而DataReader和DataWriter所针对的是流,文件流、内存流、网络流都可以用,它们所面向的应用范围不同,当然,是可以用来读写文件流的。
下面代码演示将当前时间写入文件。
// 获取文档库
StorageFolder doclib = KnownFolders.DocumentsLibrary;
// 创建文件
StorageFile file = await doclib.CreateFileAsync("new.txt", CreationCollisionOption.ReplaceExisting); // 打开文件流
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
DataWriter dw = new DataWriter(stream);
// 写入时间
dw.WriteDateTime(DateTimeOffset.Now);
// 提交数据到流
await dw.StoreAsync();
// 收工
dw.Dispose();
}
在调用StorageFile的OpenXXXAsync方法可以打开用来读写文件的流,要是想让打开的流支持写入行为,应该调用OpenAsync方法,并在参数中传递FileAccessMode.ReadWrite值,说明可读可写,如果是Read,那就只能读不能写了。当然了,如果是只读的话,也可以直接调用OpenReadAsync方法。
DataWriter类公开了N个WriteXXXXX方法,可以写入许多基础类型,比如字节、int、double、字符串等,当然也包括日期时间。
大家要记住,在你写完数据后,记得调用StoreAsync方法,因为writer在写入时不会马上就写入流中,它是先把数据写入到缓冲区中,等到StoreAsync方法调用后,就会把缓冲区中的内容写入流,然后清理缓冲区。
在DataWriter的缓冲区中存在没有保存到流的数据时,UnstoredBufferLength属性可返回未保存的数据大小,如果调用StoreAsync后,这个属性会变为0。
下面代码演示读出刚刚保存到文件中的时间。
// 获取文件
StorageFile file = await doclib.GetFileAsync(filename);
if (file != null)
{
// 打开流
using(IRandomAccessStream stream = await file.OpenReadAsync())
{
// 读出时间
using (DataReader dr=new DataReader(stream))
{
await dr.LoadAsync((uint)stream.Size);
DateTimeOffset dt = dr.ReadDateTime();
displaystr = dt.ToString("yyyy年M月d日 HH:mm:ss");
}
}
}
}
catch (FileNotFoundException)
{
displaystr = "未找到文件。";
}
catch (Exception ex)
{
displaystr = ex.Message;
}
实例化DataReader后,不要急着读,因为数据还在流中,不在reader的缓冲区中,所以,你应当先调用LoadAsync方法来加载内容,参数是要加载的字节数,返回值是实际加载的大小。加载好之后,你就可以读了。
第三种方案是混合.NET和RT库的API来读写。在System.IO命名空间下,定义了两个扩展类。
第一个是WindowsRuntimeStorageExtensions,它是针对StorageFile类的扩展,比如,调用OpenStreamForWriteAsync方法就可以直接得到一个.net中的Stream实例,这样你就可以用惯用的.net方式来读写了。
另一个是WindowsRuntimeStreamExtensions,它是针对流的扩展,支持将.net中的流与RT中的流进行相互转换。
有人会问了,既然有RT的API了,为什么还要让它与.net交互呢。你想想就知道了。
1、UWP支持的编写语言中有JS、C++,也有VB.NET和C#,C#和VB都是基于.net的语言,所以在UWP应用代码中你才能使用C#的基本类型,如int,byte,double,bool,string,float等,就是因为它是两个API子集的合体,没有.net core就无法用这些语言写代码了。
2、如果一些第三方类库使用的是.net core开发的可以跨平台移植的呢,那也得需要这种交互才能相互调用。
其实这没什么难理解的,就像中西药可以结合一起用一样的道理,把脑子放灵活一点就没什么不能理解的了。
下面代码演示写入文件。
StorageFile file = await doclib.CreateFileAsync("some.txt", CreationCollisionOption.ReplaceExisting);
Tag = file.Name;
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
// 转化为.net IO 流
using (StreamWriter writer = new StreamWriter(stream.AsStreamForWrite(), System.Text.Encoding.UTF8))
{
// 写入内容
writer.Write(content);
}
}
下面代码演示读出内容。
try
{
StorageFile file = await doc.GetFileAsync(filename);
using (IRandomAccessStream stream = await file.OpenReadAsync())
{
using (StreamReader rd = new StreamReader(stream.AsStreamForRead(), System.Text.Encoding.UTF8))
{
tb.Text = rd.ReadToEnd();
}
}
}
catch (FileNotFoundException)
{
tb.Text = "未找到文件。";
}
catch (Exception ex)
{
tb.Text = ex.Message;
}
StreamWriter和StreamReader我就不介绍了,在.net里面玩得多了。
行了,三种方案都介绍完了,至于怎么用,自己看着办吧,还是那句话——事无定法。
========================================================
下面时间,讲个小故事。
你要是问我:老周,你的记忆力是不是特别好。
还真是,但那是小时候,不知道为什么,越长大好像记忆力越后退。想想老周上小学的时候,从来不复习都可以考全级第一名,当然,全级总人数也就90来人,呵呵。
就连语文课本上要背的课文、古诗,英语课本上的对话,老周都不用课后去背,直接在课堂上完成,回家后压根不用复习。也不知道什么原因,那个时候真的可以说是过目不忘。
上了初中后就不太行了,看一遍根本记不下来,少说也要看两到三遍,尤其是背文言文。反正总感觉年龄大了,记忆力衰退。小时候可以过目不忘的本领全没了,现在拿一首唐诗出来,我起码也得读上N遍,抄上M回才能背下来,根本失去了小时候那种可以看一遍就背下来的能力了。
唉,想来岁月真是一把手术刀,把记忆力都一刀一刀地削去了。
【Win 10 应用开发】文件读写的三种方案的更多相关文章
- Python 文件读写的三种模式和区别
#coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...
- loadrunner 脚本开发-文件读写操作
脚本开发-文件读写操作 by:授客 QQ:1033553122 函数说明 函数原型: size_t fwrite( const void *buffer, size_t size, size_t co ...
- Django文件上传三种方式以及简单预览功能
主要内容: 一.文件长传的三种方式 二.简单预览功能实现 一.form表单上传 1.页面代码 <!DOCTYPE html> <html lang="en"> ...
- linux清空文件内容的三种方法
linux系统中清空文件内容的三种方法 1.使用vi/vim命令打开文件后,输入"%d"清空,后保存即可.但当文件内容较大时,处理较慢,命令如下:vim file_name:%d: ...
- LwIP协议栈开发嵌入式网络的三种方法分析
LwIP协议栈开发嵌入式网络的三种方法分析 摘要 轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中.本文结合μC/OS-II这一实时操作系统,以 ...
- [Linux]三种方案在Windows系统下安装ubuntu双系统(转)
在学习linux的过程中,ubuntu无疑是初学者的最佳选择. 下面来列举给Windows系统安装ubuntu双系统的三种方法. 一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已 ...
- 三种方案在Windows系统下安装ubuntu双系统
一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已,比如Mac OS对硬件不兼容,Federa安装频繁出错,各种驱动不全等等,不推荐使用虚拟机安装. 个人感觉这是一种对操作系统的亵 ...
- Spring-Boot-操作-Redis,三种方案全解析!
在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...
- [SQL]用于提取组内最新数据,左连接,内连接,not exist三种方案中,到底谁最快?
本作代码下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 人们总是喜欢给出或是得到一个简单明 ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- ABP文档 - 异常处理
文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个文档针对Asp.net Mvc和W ...
- CSS HTML元素布局及Display属性
本篇文章主要介绍HTML的内联元素.块级元素的分类与布局,以及dispaly属性对布局的影响. 目录 1. HTML 元素分类:介绍内联元素.块级元素的分类. 2. HTML 元素布局:介绍内联元素. ...
- Java程序员:工作还是游戏,是该好好衡量一下了
前阵子我终于下定决心,删掉了硬盘里所有的游戏. 身为一个程序猿,每天都要和各种新技术打交道,闲暇时间,总还得看一下各大论坛,逛逛博客园啥的,给自己充充电.游戏的话,其实我自小就比较喜欢,可以算是一种兴 ...
- BPM费控管理解决方案分享
一.方案概述费用是除经营成本外企业的最主要支出,费用管理是财务管理的核心之一,加强企业内控管理如:费用申请.费用报销.费用分摊.费用审批.费用控制和费用支付等,通过科学有效的管理方法规范企业费用管理, ...
- H3 BPM产品安装手册(.Net版本)
1 安装说明 1.1 服务器安装必备软件 在使用该工作流软件之前,有以下一些软件是必须安装: l IIS7.0以上版本(必须): l .Net Framework 4.5(必 ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- 我将系统从Windows迁移至Linux下的点点滴滴
一.写在最前 由于本人的技术水平有限,难免会出现错误.本文对任何一个人有帮助都是我莫大的荣幸,任何一个大神对我的点拨,我都会感激不尽. 二.技术选型 在2013年8月低的时候,公司中了XXX市场监督局 ...
- 【初码干货】在Window Server 2016中使用Web Deploy方式发布.NET Web应用的重新梳理
在学习和工作的过程中,发现很多同事.朋友,在做.NET Web应用发布的时候,依然在走 生成-复制到服务器 这样的方式,稍微高级一点的,就是先发布到本地,再上传到服务器 这种方式不仅效率低下,而且不易 ...
- CSharpGL(36)通用的非托管数组排序方法
CSharpGL(36)通用的非托管数组排序方法 如果OpenGL要渲染半透明物体,一个方法是根据顶点到窗口的距离排序,按照从远到近的顺序依次渲染.所以本篇介绍对 UnmanagedArray< ...