【WIN10】程序內文件讀取與保存
DEMO下載:http://yunpan.cn/cFHIZNmAy4ZtH 访问密码 cf79
1.讀取與保存文件
Assets一般被認為是保存用戶文件數據的地方。同時,微軟還支持用戶自己創建文件夾。如下圖:
可以創建自己的文件夾data,當然命名可以任意命名,然後往裡面添加文件。我們再來看看test.txt的屬性,如下圖:
如果開發過WP8程序的人,可能對這個會比較印象深刻。WP8開發中,“生成操作”需要手動設置為“內容”,在WIN10中,已經默認為“內容”了,這才是比較正常的處理,我們加一個文件,不就是為了放到程序內部嗎?為毛還要手動去設置?WIN10開發顯示就比較合理了。
我寫了一個 Common 的類,用於打開文件,以讀及寫:
public class Common
{
public static async Task<Stream> OpenFileForRead(string folder, string fileName, bool installFolder = true)
{
try
{
StorageFolder storageFolder = null;
if (installFolder) storageFolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(folder);
else storageFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync(folder);
StorageFile storageFile = await storageFolder.GetFileAsync(fileName); return await storageFile.OpenStreamForReadAsync();
}
catch (Exception ex)
{
return null;
}
} public static async Task<Stream> OpenFileForWrite (string folder, string file)
{
try
{
StorageFolder rootFolder = ApplicationData.Current.LocalFolder;
StorageFolder dstFolder = await rootFolder.CreateFolderAsync(folder, CreationCollisionOption.OpenIfExists);
if (dstFolder != null)
{
StorageFile storageFile = await dstFolder.CreateFileAsync(file, CreationCollisionOption.ReplaceExisting);
return await storageFile.OpenStreamForWriteAsync();
}
}
catch (Exception)
{
} return null;
}
}
你會發現,它們都是“異步”函數。所以要程序讀取一些信息並顯示時,可能需要一個“委託”,當讀完時,通知界面去顯示相關信息,或是其它處理。
*****************************************************************************************************************************************************************
注意上面的代碼,寫文件,只能在該文件夾下寫:ApplicationData.Current.LocalFolder
安裝目錄 Windows.ApplicationModel.Package.Current.InstalledLocation 是不允許寫的。
*****************************************************************************************************************************************************************
我的DEMO中,不僅加入了創建文件的代碼,還加入了創建文件夾的代碼。
2.使用Roaming進行保存與讀取數據
這個東東,相當於程序的系統中的配置。使用它進行保存數據的好處是,當程序更新時,你做的保存不會丟失。
如果是使用第一種方法進行保存程序數據的話,當軟件更新時,有可能會將用戶保存的數據覆蓋。那樣問題就比較嚴重了,用戶今天還好好的,晚上WIFI自動更新後,一覺起來,神馬都沒有了,突然間整個人都不好了。
微軟提供的Roaming是相當強悍的,可以像Json一樣使用,具體內部是不是使用Json實現,我沒有深入研究過,不過我猜應該是。
可以創建Container,然後在Container中保存一堆[key,value]組合,Container中又可以創建Container。和Json一個樣。這種分層保存數據十分適合軟件吶,如果只有一層[key,value],那要加一堆前輟進行說明這個key是誰誰誰就蛋疼了。
讀的例子:
private void readRoamingBtn_Click(object sender, RoutedEventArgs e)
{
var appSetting = ApplicationData.Current.RoamingSettings; var trueContainer = appSetting;
if (IsCreateContainer())
{
ApplicationDataContainer adc = null;
if (!appSetting.Containers.TryGetValue("test", out adc))
{
MessageDialog dlg = new MessageDialog("no container");
dlg.ShowAsync();
return;
} trueContainer = adc;
} object testValue = null;
if (trueContainer.Values.TryGetValue("key", out testValue))
{
roadmingReadTxtBox.Text = testValue.ToString();
}
else
{
MessageDialog dlg = new MessageDialog("no key");
dlg.ShowAsync();
}
}
寫的例子:
private void roamingWriteBtn_Click(object sender, RoutedEventArgs e)
{
var appSetting = ApplicationData.Current.RoamingSettings; var trueContainer = appSetting;
if (IsCreateContainer())
{
trueContainer = MakeSureArticleCfgContainerExist(appSetting, "test");
} trueContainer.Values["key"] = roamingWriteTxtBox.Text;
}
有一個 MakeSureArticleCfgContainerExist 函數,用於確定寫入的文件夾一定存在,如果不存在就創建它:
private ApplicationDataContainer MakeSureArticleCfgContainerExist(ApplicationDataContainer appSetting, string name)
{
ApplicationDataContainer container = null;
if (!appSetting.Containers.TryGetValue(name, out container))
{
container = appSetting.CreateContainer(name, ApplicationDataCreateDisposition.Always);
} return container;
}
3.使用Resource
資源文件又被微軟給閹割了,它只能使用 String.
使用方法:
1)添加Resource
菜單:右鍵項目->添加->新建項->資源Resource
2)加載Resource
ResourceLoader rl = new ResourceLoader();
txtResource.Text = rl.GetString("String1");
[END]
【WIN10】程序內文件讀取與保存的更多相关文章
- Win10的Hosts文件修改后无法保存的问题解决方法,实测可以
1.hosts文件是什么?有什么作用呢? Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个 ...
- 什么是Nib文件?(Nib文件是一种特殊类型的资源文件,它用于保存iPhone OS或Mac OS X应用程序的用户接口)
Nib文件是一种特殊类型的资源文件,它用于保存iPhone OS或Mac OS X应用程序的用户接口.Nib文件是Interface Builder文档.通常您会使用Interface Builder ...
- 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法
下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片 将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...
- 小程序切换账户拉取仓库文件的appid提示
小程序切换账户拉取仓库文件,拉取后appid会提示项目不是当前appid的项目,因为切换了账户,而每个小程序账户只有一个appid,所以会冲突 去project.config.json里吧appid改 ...
- PHPExcel讀取excel數據
require_once 'PHPExcel.php'; $PHPReader = new PHPExcel_Reader_Excel2007(); $filePath = 'wjyl.xlsx'; ...
- In App Purchases(IAP 应用程序內购买): 完全攻略
原文: http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/ 参考: http://www.cocoachina ...
- MailSystem.NET Gmail IMAP讀取信件
程式的主流程為: 開啟SSL連線,逐一讀取收信匣中的信件,將信件內文HTML及附檔逐一存檔後,再將信件移至垃圾桶. 程式碼如下,補充說明我寫在註解裡,請參考: static void Main(str ...
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...
- C# 通过api函数GetPrivateProfileString读取ini文件,取不到值
通过api函数GetPrivateProfileString读取ini文件,取不到值,测试了好长时间,都不行 确认程序,ini文件都没有错误的情况,最后发现是ini文件编码的原因. 将ini文件的编码 ...
随机推荐
- Google Congestion Control介绍
随着网络带宽的日益增加和便携式设备,如智能手机或平板电脑处理能力的增强,基于互联网的实时通信已经成为热点. 虽然视频会议已商用了多年,特别是SKYPE这样的视频应用在互联网上已有10年时间,但针对实时 ...
- python 进程 线程 协程
并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的 ...
- 十三、springboot集成定时任务(Scheduling Tasks)
定时任务(Scheduling Tasks) 在springboot创建定时任务比较简单,只需2步: 1.在程序的入口加上@EnableScheduling注解. 2.在定时方法上加@Schedule ...
- 13 JSON-RPC: a tale of interfaces
JSON-RPC: a tale of interfaces 27 April 2010 Here we present an example where Go's interfaces made i ...
- 04 Effective Go 高效的go语言 重点内容
Effective Go 高效的go语言 Introduction 介绍 Examples 例子 Formatting 格式 Commentary 评论 Names 名字 Package names ...
- 缓存数据库-redis介绍
一:Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的 ...
- 错误/异常:The project cannot be built until build path errors are resolved 和 Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'MyJavaCode';的解决方法
错误1: The project cannot be built until build path errors are resolved 解决方法: 把java的类库加载进去即可,在工程上右键 选择 ...
- 洛谷P1525关押罪犯
传送门啦 想让最大值最小,所以,这题可以用二分法,排序之后发现可以并查集,因为要使最大值最小,排序后这个最大值是存在的. 对于会冲突的两个罪犯,我们连一条无向边,然后按权值从大到小排序,从大到小枚举每 ...
- C++之插入迭代器
#include<iostream> #include<vector> #include<list> #include<iterator> usingn ...
- SQL Case when 的使用方法 (转)
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...