win10 uwp 保存用户选择文件夹
如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp垃圾?
其实垃圾wr给了一个类,我们可以用这个类获得用户选择过的文件、文件夹。我们可以保存用户选择过的文件和文件夹。
这个类在Windows.Storage.AccessCache
,可以使用最近使用或一个比较大的存储,最近使用自有25个,我这里就不说。FutureAccessList可以存储1k个文件或文件夹,但垃圾wr给了我们这个东西,找不到他就给1k而不是无限。
要使用这个类,其实我们就只用三个函数,其中我们需要知道,使用FutureAccessList拿出一个我们保存的文件或文件夹需要一个token。
我们先从让用户选择选择文件夹,选择文件夹需要FolderPicker。
不知道FolderPicker需要FileTypeFilter,这个设计。我们需要给他一个值,开头是”.”
FolderPicker pick=new FolderPicker();
pick.FileTypeFilter.Add(".png");
然后让用户选择,这里是异步,我们可以让用户选择,然后我们做我们的。
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放到我们本地文件的位置。
我放在account/account.json
先拿到本地文件夹
string folderStr = "account";
StorageFolder folder = ApplicationData.Current.LocalFolder;
创建一个文件夹account,因为如果是第一次我们就没有文件夹,如果不是我们就有
try
{
folder = await folder.GetFolderAsync(folderStr);
}
catch (FileNotFoundException)
{
folder = await folder.CreateFolderAsync(folderStr);
}
创建文件
StorageFile file = await folder.CreateFileAsync(
folderStr+".json", CreationCollisionOption.ReplaceExisting);
因为我们就保存一次,一个好的做法是创建temp,然后做完所有再把原来的改名字为以前做的,然后把temp改名字为account.json,注意保存原先改名字的文件,并把原先改名字的之前的文件删除。
如果我们在保存失败,那么我们的原先文件不会影响,如果我们保存文件在改名字出错了,可以通过原先恢复,这样才好。
我们使用json保存,使用我们第三方。
var json = JsonSerializer.Create();
我们需要用StringBuilder来把json序列存放,如果直接用
json.Serialize(new JsonTextWriter(
new StreamWriter(await file.OpenStreamForWriteAsync())), Account);
就会出现下次使用UnauthorizedException,UWP UnauthorizedException 创建文件在LocalFolder一般就是我们使用json错误
Account就是我们的数据。
我写的方法应该可以是可以把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();
}
}
我们应用开始我们就可以读取
读取就可以用json的
StorageFile file = await folder.GetFileAsync(folderStr + ".json");
var json = JsonSerializer.Create();
Account = json.Deserialize<Account>(new JsonTextReader(
new StreamReader(await file.OpenStreamForReadAsync())));
folder要进去account
我们从FutureAccessList拿文件
file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(Account.Token);
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
win10 uwp 保存用户选择文件夹的更多相关文章
- 2019-9-2-win10-uwp-保存用户选择文件夹
title author date CreateTime categories win10 uwp 保存用户选择文件夹 lindexi 2019-09-02 12:57:38 +0800 2018-2 ...
- C# WINFORM 编程中,选择**文件夹**而不是文件的方法(转)
我们选择文件可以用 OpenFileDialog ,但是文件夹有两种方法. 法一: 用C#的FolderNameEditor类的子类FolderBrowser类来实现获取浏览文件夹对话框的功能.下面来 ...
- Winforms选择文件夹、文件
更新记录: 2022年5月28日 初始记录 选择文件夹 if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK) { //获得用户选 ...
- python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)
# python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件) import tkinter as tk from tkinter import filedial ...
- C#选择文件、选择文件夹、打开文件
1.选择文件用OpenDialog OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true;//该值确定是否可以 ...
- C# 选择文件、选择文件夹、打开文件(或者文件夹) 路径中获取文件全路径、目录、扩展名、文件名称 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名!!
https://www.cnblogs.com/zhlziliaoku/p/5241097.html 1.选择文件用OpenDialog OpenFileDialog dialog = new Ope ...
- delphi 选择文件夹,路径选择,浏览文件夹
选择文件夹,路径选择, 文件夹 资源管理器 推荐 SelectDirectory http://docwiki.embarcadero.com/Libraries/Seattle/en/Vcl.Fi ...
- c++选择文件夹对话框
1,目的 提供一个对话框供用户选择一个文件夹路径. 2,原理&实现 先贴上这个工具类的源码: 在你的程序中使用静态方法 CSelectFolderDlg::Show() 就能显示一个选择文件夹 ...
- C# winform选择文件、选择文件夹、打开文件
文章来自博客园友,这里只是做一下笔记. 来源:https://www.cnblogs.com/liuqifeng/p/9149125.html 一.选择文件用OpenDialog OpenFileDi ...
随机推荐
- 201521123091 《Java程序设计》第5周学习总结
Java 第五周总结 第五周的作业. 目录 1.本章学习总结 2.Java Q&A 3.使用码云管理Java代码 4.PTA实验 1.本章学习总结 1.1 尝试使用思维导图总结有关多态与接口的 ...
- 201521123055 《Java程序设计》第8周学习总结
1. 本章学习总结 2. 书面作业 Q1.List中指定元素的删除(题目4-1) public static List<String> convertStringToList(String ...
- 才趟过的一个坑,css造成的Validform表单提交按钮点击无效
最近入手的一个项目,在开发的过程中,遇到了一个以前没遇到过的问题,废了半天的功夫才弄懂原因,留下足迹,警醒后人,下面开始讲故事啦! 在一个昏天暗地的上午,我一个人照常坐在办公室安静的工作中!项目编码已 ...
- 接口测试入门(5)----新框架重构,使用轻量级的HTTP开发库 Unirest
之前的第一套框架在使用过程中发现存在以下问题: 一. 框架1缺点: 1.登陆的账号每个人写的不一样,一旦用户在测试环境被修改,则导致用例失败 2.每次读取访问网址,需要在同一个java文件下切换测试 ...
- MySql Jar 包下载
MySql JAR 包下载 我们要使用Spring 链接MySql 需要两个Jar 包 一个是C3p0 一个是MySql 的Connection Jar 包 C3p0: 进入下面的网址 h ...
- [UIKit学习]07.关于如何选择UIButton、UILable、UIImageView
如何选择UIButton.UILable.UIImageView 在不添加手势的前提下,只要不涉及到点击和多状态表现就尽量不要选择UIButton
- String和StringBuffer分别作为参数传递注意项
public staticvoid main(){ String s1 = "abc"; StringBuffer sb = new StringBuffer(); sb.appe ...
- echo和print的区别
1.echo可以同时输出多个字符串: echo 'this',' string',' is'," hello world\n"; 2.print有返回值,但是运行速度上echo比较 ...
- oracle数据库备份、还原 (如何将Oracle 11g备份的dat文件导入到10g数据库里面)
如何将Oracle 11g备份的dat文件导入到10g数据库里面 解决方法: 导出的时候后面加上目标数据库的版本号 导出: 在SQL plus下执行:create or replace ...
- EOutOfResources字符异常
近日,用Delphi编程时,遇到一个莫名其妙的异常:EOutOfResources,这是一个可以重复再现的异常.开始以为是程序中创建的对象太多,导致占用了过多的资源,引起了这个异常.于是在代码中将许多 ...