zoukankan      html  css  js  c++  java
  • 【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]

  • 相关阅读:
    深入Eureka/Feign/Hystrix原理学习(1)
    mysql截取函数substring_index()和right()用法
    Mybatis映射文件的自动映射与手动映射问题
    MySQL单向加密函数
    Grovvy带参数的闭包
    微信小程序开发编程手记20190303
    IDEA 各版本在线激活(激活码)
    Vue实例:演示input 和 textarea 元素中使用 v-model 实现双向数据绑定
    mybatis异常解决:class path resource [SqlMapConfig.xml] cannot be opened because it does not exist
    【学亮IT手记】MySql行列转换案例
  • 原文地址:https://www.cnblogs.com/lin277541/p/4888256.html
Copyright © 2011-2022 走看看