DEMO下載:http://yunpan.cn/cFHIZNmAy4ZtH  访问密码 cf79

1.讀取與保存文件

Assets一般被認為是保存用戶文件數據的地方。同時,微軟還支持用戶自己創建文件夾。如下圖:

可以創建自己的文件夾data,當然命名可以任意命名,然後往裡面添加文件。我們再來看看test.txt的屬性,如下圖:

如果開發過WP8程序的人,可能對這個會比較印象深刻。WP8開發中,“生成操作”需要手動設置為“內容”,在WIN10中,已經默認為“內容”了,這才是比較正常的處理,我們加一個文件,不就是為了放到程序內部嗎?為毛還要手動去設置?WIN10開發顯示就比較合理了。

我寫了一個 Common 的類,用於打開文件,以讀及寫:

  1. public class Common
  2. {
  3. public static async Task<Stream> OpenFileForRead(string folder, string fileName, bool installFolder = true)
  4. {
  5. try
  6. {
  7. StorageFolder storageFolder = null;
  8. if (installFolder) storageFolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(folder);
  9. else storageFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync(folder);
  10. StorageFile storageFile = await storageFolder.GetFileAsync(fileName);
  11.  
  12. return await storageFile.OpenStreamForReadAsync();
  13. }
  14. catch (Exception ex)
  15. {
  16. return null;
  17. }
  18. }
  19.  
  20. public static async Task<Stream> OpenFileForWrite (string folder, string file)
  21. {
  22. try
  23. {
  24. StorageFolder rootFolder = ApplicationData.Current.LocalFolder;
  25. StorageFolder dstFolder = await rootFolder.CreateFolderAsync(folder, CreationCollisionOption.OpenIfExists);
  26. if (dstFolder != null)
  27. {
  28. StorageFile storageFile = await dstFolder.CreateFileAsync(file, CreationCollisionOption.ReplaceExisting);
  29. return await storageFile.OpenStreamForWriteAsync();
  30. }
  31. }
  32. catch (Exception)
  33. {
  34. }
  35.  
  36. return null;
  37. }
  38. }

你會發現,它們都是“異步”函數。所以要程序讀取一些信息並顯示時,可能需要一個“委託”,當讀完時,通知界面去顯示相關信息,或是其它處理。

*****************************************************************************************************************************************************************

注意上面的代碼,寫文件,只能在該文件夾下寫: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是誰誰誰就蛋疼了。

讀的例子:

  1. private void readRoamingBtn_Click(object sender, RoutedEventArgs e)
  2. {
  3. var appSetting = ApplicationData.Current.RoamingSettings;
  4.  
  5. var trueContainer = appSetting;
  6. if (IsCreateContainer())
  7. {
  8. ApplicationDataContainer adc = null;
  9. if (!appSetting.Containers.TryGetValue("test", out adc))
  10. {
  11. MessageDialog dlg = new MessageDialog("no container");
  12. dlg.ShowAsync();
  13. return;
  14. }
  15.  
  16. trueContainer = adc;
  17. }
  18.  
  19. object testValue = null;
  20. if (trueContainer.Values.TryGetValue("key", out testValue))
  21. {
  22. roadmingReadTxtBox.Text = testValue.ToString();
  23. }
  24. else
  25. {
  26. MessageDialog dlg = new MessageDialog("no key");
  27. dlg.ShowAsync();
  28. }
  29. }

寫的例子:

  1. private void roamingWriteBtn_Click(object sender, RoutedEventArgs e)
  2. {
  3. var appSetting = ApplicationData.Current.RoamingSettings;
  4.  
  5. var trueContainer = appSetting;
  6. if (IsCreateContainer())
  7. {
  8. trueContainer = MakeSureArticleCfgContainerExist(appSetting, "test");
  9. }
  10.  
  11. trueContainer.Values["key"] = roamingWriteTxtBox.Text;
  12. }

有一個 MakeSureArticleCfgContainerExist 函數,用於確定寫入的文件夾一定存在,如果不存在就創建它:

  1. private ApplicationDataContainer MakeSureArticleCfgContainerExist(ApplicationDataContainer appSetting, string name)
  2. {
  3. ApplicationDataContainer container = null;
  4. if (!appSetting.Containers.TryGetValue(name, out container))
  5. {
  6. container = appSetting.CreateContainer(name, ApplicationDataCreateDisposition.Always);
  7. }
  8.  
  9. return container;
  10. }

3.使用Resource

資源文件又被微軟給閹割了,它只能使用 String.

使用方法:

1)添加Resource

菜單:右鍵項目->添加->新建項->資源Resource

2)加載Resource

  1. ResourceLoader rl = new ResourceLoader();
  2. txtResource.Text = rl.GetString("String1");

[END]

【WIN10】程序內文件讀取與保存的更多相关文章

  1. Win10的Hosts文件修改后无法保存的问题解决方法,实测可以

    1.hosts文件是什么?有什么作用呢? Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个 ...

  2. 什么是Nib文件?(Nib文件是一种特殊类型的资源文件,它用于保存iPhone OS或Mac OS X应用程序的用户接口)

    Nib文件是一种特殊类型的资源文件,它用于保存iPhone OS或Mac OS X应用程序的用户接口.Nib文件是Interface Builder文档.通常您会使用Interface Builder ...

  3. 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法

    下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片   将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...

  4. 小程序切换账户拉取仓库文件的appid提示

    小程序切换账户拉取仓库文件,拉取后appid会提示项目不是当前appid的项目,因为切换了账户,而每个小程序账户只有一个appid,所以会冲突 去project.config.json里吧appid改 ...

  5. PHPExcel讀取excel數據

    require_once 'PHPExcel.php'; $PHPReader = new PHPExcel_Reader_Excel2007(); $filePath = 'wjyl.xlsx'; ...

  6. In App Purchases(IAP 应用程序內购买): 完全攻略

    原文: http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/ 参考: http://www.cocoachina ...

  7. MailSystem.NET Gmail IMAP讀取信件

    程式的主流程為: 開啟SSL連線,逐一讀取收信匣中的信件,將信件內文HTML及附檔逐一存檔後,再將信件移至垃圾桶. 程式碼如下,補充說明我寫在註解裡,請參考: static void Main(str ...

  8. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  9. C# 通过api函数GetPrivateProfileString读取ini文件,取不到值

    通过api函数GetPrivateProfileString读取ini文件,取不到值,测试了好长时间,都不行 确认程序,ini文件都没有错误的情况,最后发现是ini文件编码的原因. 将ini文件的编码 ...

随机推荐

  1. Ubuntu 通过 Live CD 更新grub恢复引导Boot Menu

    工作需要更换主板,但是不想重装电脑. 怎么办呢? 其实并不需要重装电脑,只需要回复boot menu即可. 1. 首先用u盘制作一个ubuntu的live CD(请自行百度),然后通过u盘启动, 选择 ...

  2. 终端多窗口分屏Terminator

    1.安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator 2.快捷键 Ctrl+Shift+E 垂直分割窗口 Ctrl+ ...

  3. DRM/KMS 基本组件介绍

    Each DRM device provides access to manage which monitors and displays are currently used and what fr ...

  4. aarch64_l4

    livestreamer-1.12.2-7.fc26.noarch.rpm 2017-02-11 17:38 537K fedora Mirroring Project lizardfs-adm-3. ...

  5. Mysql_Learning_Notes_mysql系统结构_2

    Mysql_Learning_Notes_mysql系统结构_2 三层体系结构,启动方式,日志类型及解析方法,mysql 升级 连接层 通信协议处理\线程处理\账号认证(用户名和密码认证)\安全检查等 ...

  6. 那些代表性的HTTP状态码,你还只知道404吗?快来看看吧【转】

    前言 在网络上发送请求后,经常会根据请求的状态码去判断请求的成功失败与否,常见的状态码有200,404,500. 不过你以为HTTP请求的状态码就只有这么几个么?其实是远远比这个多的. 今天这篇文章我 ...

  7. nginx 的多域名多https转发设置方法【转】

    version: 1.1(fixed) 修正一些错误基本环境:/etc/nginx/nginx.conf #保持/etc/nginx/ssl/    #ssl认证文件/etc/nginx/site-a ...

  8. html5学习之canvas

    Canvas画布 1.绘图方法 ctx.moveTo(x,y) 落笔ctx.lineTo(x,y) 连线ctx.stroke() 描边 ctx.beginPath(): 开启新的图层 演示: stro ...

  9. Web测试技术要领

    基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战.基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否 ...

  10. c语言格式控制符

    http://zhidao.baidu.com/link?url=-YJjz3U0fd_eSW9eLa8ankGo_QbyOOOaKYWyAY9g4mKWQj0DN6l12OSLJz24U8jCwo1 ...