title author date CreateTime categories
win10 uwp 保存用户选择文件夹
lindexi
2019-09-02 12:57:38 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp垃圾?

其实垃圾wr给了一个类,我们可以用这个类获得用户选择过的文件、文件夹。我们可以保存用户选择过的文件和文件夹。

这个类在Windows.Storage.AccessCache,可以使用最近使用或一个比较大的存储,最近使用StorageItemMostRecentlyUsedList 只有存储25个,我这里就不说。如果需要存多点,我们可以使用 FutureAccessList ,使用StorageApplicationPermissions.FutureAccessList 可以存储1k个文件或文件夹,但垃圾wr给了我们这个东西,就不知道为何他就给1k而不是无限。

其实说是 1k ,和无限也差不多,因为他算的不只是文件,如果是文件夹,也算一个。假如我们有1000000000个文件,我们把它放在一个文件夹,把文件夹放 FutureAccessList ,算一个,不是 1000000000 个 。这个问题在博客上次没有说明白,让花神认为可以放的文件就 1k 个,其实可以放的文件比较多,就把文件放在文件夹,存文件夹。

要使用这个类,其实我们就只用三个函数,其中我们需要知道,使用 FutureAccessList 拿出一个我们保存的文件或文件夹时需要一个 token 。它是如何来的,在我们添加一个文件或文件夹,就会返回的,于是我们要把它保存。

我们先从让用户选择选择文件夹,选择文件夹需要 FolderPicker 。

不知道 FolderPicker 需要 FileTypeFilter,这个设计有个r用。他还必须要给,于是我们需要给他一个值,开头是"." 后面还需要一些e文,当然中文也可以。

            FolderPicker pick=new FolderPicker();
pick.FileTypeFilter.Add(".png"); 我不想说他这个有什么用,垃圾wr

然后让用户选择,这里是异步,我们可以让用户选择,然后我们在后台继续做我们的。

            IAsyncOperation<StorageFolder> folderTask= pick.PickSingleFolderAsync();
//做我们的
StorageFolder folder = await folderTask;

我们可以写省一点,让用户选择文件夹,而我们不做什么

            var folder = await pick.PickSingleFolderAsync();

判断用户选择,如果有选择文件夹,可以看到 folder !=null

判断选择之后,我们需要把它放进 FutureAccessList,放进去可以拿到token

            if (folder != null)
{
Folder = folder;
Address = folder.Path;
Token = StorageApplicationPermissions.FutureAccessList.Add(folder);
}

我们想拿出文件或文件夹,需要token,我们需要把token放到我们本地文件的位置。

我放在 account/account.json 文件里

先拿到本地文件夹

            string folderStr = "account";
StorageFolder folder = ApplicationData.Current.LocalFolder;

创建一个文件夹 account ,因为如果是第一次我们就没有文件夹,如果不是我们就有

            try
{
folder = await folder.GetFolderAsync(folderStr);
}
catch (FileNotFoundException) 我们使用的是File没找到,不爽自己做一个Folder没找到
{
folder = await folder.CreateFolderAsync(folderStr);
}

创建文件可以覆盖存在的Account.json

            StorageFile file = await folder.CreateFileAsync(
folderStr+".json", CreationCollisionOption.ReplaceExisting);

因为我们就保存一次,如果在保存中,用户关机,那么就和微软的诺基亚差不多了。一个好的做法是创建 temp 文件,写入 temp 文件,然后做完所有再把原来的改名字为以前做的,然后把temp改名字为account.json,注意保存原先改名字的文件,并把原先改名字的之前的文件删除。

如果我们在保存失败,那么我们的原先文件不会影响,如果我们保存文件在改名字出错了,可以通过原先恢复,这样才好。

我们使用json保存,json可以使用第三方,我有写过 win10 uwp json 保存相关的。

  var json = JsonSerializer.Create();

我们需要用 StringBuilder 来把json序列存放,如果直接用

            json.Serialize(new JsonTextWriter(
new StreamWriter(await file.OpenStreamForWriteAsync())), Account);

就会出现下次使用 UnauthorizedException,UWP UnauthorizedException 创建文件在 LocalFolder 。这个一般就是我们使用json错误,我提供简单方法,可以让保存不出现这个异常

我写的方法应该可以是可以把 token 保存的

            StringBuilder str = new StringBuilder();
StringWriter stream=new StringWriter(str);
json.Serialize(new JsonTextWriter(
stream ), Account);
using (StorageStreamTransaction transaction = await file.OpenTransactedWriteAsync())
{
using (DataWriter dataWriter = new DataWriter(transaction.Stream))
{
dataWriter.WriteString(str.ToString());
transaction.Stream.Size = await dataWriter.StoreAsync();
await transaction.CommitAsync();
}
}

我们应用开始我们就可以读取 account.json

读取就可以用 json 的 Deserialize

                    StorageFile file = await folder.GetFileAsync(folderStr + ".json");
var json = JsonSerializer.Create();
Account = json.Deserialize<Account>(new JsonTextReader(
new StreamReader(await file.OpenStreamForReadAsync())));

我们从 FutureAccessList 拿文件就可以用 StorageApplicationPermissions.FutureAccessList.GetFileAsync

             file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(Account.Token);

2019-9-2-win10-uwp-保存用户选择文件夹的更多相关文章

  1. win10 uwp 保存用户选择文件夹

    如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp ...

  2. C# WINFORM 编程中,选择**文件夹**而不是文件的方法(转)

    我们选择文件可以用 OpenFileDialog ,但是文件夹有两种方法. 法一: 用C#的FolderNameEditor类的子类FolderBrowser类来实现获取浏览文件夹对话框的功能.下面来 ...

  3. Winforms选择文件夹、文件

    更新记录: 2022年5月28日 初始记录 选择文件夹 if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK) { //获得用户选 ...

  4. windows API实现用户选择文件路径的对话框

    在编写应用程序时,有时需要用户选择某个文件,以供应用程序使用,比如在某些管理程序中需要打开某一个进程,这个时候需要弹出一个对话框来将文件路径以树形图的形式表示出来,以图形化的方式供用户选择文件路径,而 ...

  5. python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)

    # python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件) import tkinter as tk from tkinter import filedial ...

  6. asp.net选择文件夹上传

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

  7. C#选择文件、选择文件夹、打开文件

    1.选择文件用OpenDialog OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true;//该值确定是否可以 ...

  8. C# 选择文件、选择文件夹、打开文件(或者文件夹) 路径中获取文件全路径、目录、扩展名、文件名称 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名!!

    https://www.cnblogs.com/zhlziliaoku/p/5241097.html 1.选择文件用OpenDialog OpenFileDialog dialog = new Ope ...

  9. delphi 选择文件夹,路径选择,浏览文件夹

    选择文件夹,路径选择, 文件夹 资源管理器 推荐  SelectDirectory http://docwiki.embarcadero.com/Libraries/Seattle/en/Vcl.Fi ...

随机推荐

  1. BCB怎么调用DLL中的函数

    推荐你看<BCB编写DLL终极手册>这篇文章如下片段:二. 静态调用 DLL使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中将该文件拷贝到当前目 ...

  2. SCOI2015

    这周各种头疼,一直睡觉+发呆,啥子都没干. 就补一下之前的东西. d1t1小凸玩矩阵 传送门 一开始脑子抽写了最小费用最大流,不知道自己怎么想的. 第k大最小,明显的二分,又是二分图,二分第k大值,把 ...

  3. JavaSE_11_File类、递归

    1.1 概述File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.2 构造方法 public File(String pathname ...

  4. zabbix自动发现主机(转)

    zabbix自动发现主机 2018年06月15日 18:02:52 loyal-Wang 阅读数:817更多 个人分类: zabbix   版权声明:本文为博主原创文章,转载请注明出处. https: ...

  5. wget: command not found 解决方案

    wget: command not found 解决方案 wget command not found 解决方案 问题分析 解决方案 方法一yum安装wget 方法二rpm安装 问题分析 安装的是Ce ...

  6. IOS学习笔记56-IOS7状态栏适配方法一

    近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,所以了,我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下 ...

  7. vue-cli 本地环境 API 代理设置和解决跨域

    前言 我们在使用 vue-cli 启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以 localhost: 来请求接口数据的,localhost 是没有办法设置 coo ...

  8. Eclipse Java开发环境的搭建

    (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2016年9月6日) 工作室的老人家们和小朋友们组成了一个Java开发学习团队,想起之前在暑假项目中学过一点Java基础知识 ...

  9. VS2005下安装boost

    本文参照http://dxwang.blog.51cto.com/384651/711798 (一)boost的安装和编译 1:下载boost版本,目前最新的版本为1-47-0    下载地址为htt ...

  10. C++ 赋值函数为什么返回reference to *this?

    赋值操作为什么要返回 reference to *this? 要弄清这个问题之前,先了解函数的返回值类型:返回值类型,返回引用类型 返回值类型:返回的是一个对象的副本. test operator= ...