Win10/UWP新特性系列-GetPublisherCacheFolder
微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的数据是不会被别的App获取到的。
在UWP中,微软新增了GetPublisherCacheFolder —— 共享存储文件夹的机制,这个获取的共享存储文件夹并不是说打破了原有的"沙盒机制",而是指,同一个软件开发商发布的App之间,是允许访问一个共享的文件夹以及里面的内容。例如,多个应用程序使用相同的图片或者相同的自定义字体,你就可以将这些文件保存在共享存储文件夹中,再或者类似腾讯,腾讯可以把QQ用户的登录信息存储到共享文件夹中,方便于腾讯其他App(QQ空间、QQ音乐等)获取登录信息实现免登录功能。当然,微软的意见还是说让用户有权利了解并知情自己的哪些信息被存储到了共享存储空间中,并还拥有拒绝此操作的权利。
应用的共享存储文件夹将会伴随着第一次安装该开发商的App时创建(如果App使用了该特性)。当然共享存储文件夹也有限制和使用要求:
- 共享数据文件夹不能作为备份和漫游数据来使用,此外,用户有权利知情共享存储文件夹里面的数据。
- 不同的软件开发商之间是不能进行共享数据文件夹操作
- 不能把不同用户之间的数据存储到共享存储文件夹内,防止用户隐私被其他用户知情
- 共享存储文件夹没有版本控制机制
▲ 声明共享存储文件夹
首先,我们需要在App配置文件中声明这些共享存储文件夹名称,不需要提前创建好这些文件夹,系统会自己帮你创建。
<Package>
…
<Extensions>
…
<Extension Category="windows.publisherCacheFolder">
<PublisherCacheFolder>
<Folder Name="Folder1">
<Folder Name="Folder2">
</PublisherCacheFolder>
</Extension>
…
</Extensions>
…
</Package>
▲ 访问共享数据文件夹
我们可以调用GetPublisherCacheFolder方法获取共享数据文件夹:
StorageFolder sharedFonts = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("fonts");
然后使用StorageFolder类来操作共享存储文件和文件夹。
▲ 共享存储文件夹使用限制
- 共享存储文件夹中没有默认的子文件夹,你在调用GetpublisherCacheFolder 方法时必须填写要操作的文件夹名称
- 只允许访问配置清单中给出的文件夹
- 不允许访问共享存储文件夹的根目录文件夹
▲ 共享存储文件夹的清理
我们可以调用ClearPublisherCacheFolderAsync方法来明确指定要清理哪个子文件夹的文件或者哪个共享存储文件夹。共享文件夹自行删除是在卸载最后一个该开发商的App时发生的,共享文件夹是不受App应用程序保护的,当存在多个该开发商的App时,直到卸载最后一个,共享存储文件夹才会彻底被系统删除。
下面举个例子,我们在两个App中都声明使用共享存储文件夹,然后从App_A中存储一个字符串到共享存储文件夹中的一个文件,接着我们在App_B中来获取这个字符串,
App_A和App_B的UI Code 和 cs代码完全一致。
首先,创建一个UWP解决方案,然后创建两个项目

接着分别打开两个项目的Package.appxmanifest文件,添加对共享存储文件的声明:
<Extensions>
<Extension Category="windows.publisherCacheFolders">
<PublisherCacheFolders>
<Folder Name="Folder1"/>
<Folder Name="Folder2"/>
</PublisherCacheFolders>
</Extension>
</Extensions>
然后在页面上创建一个文本框和两个按钮,如下:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center">
<TextBox x:Name="txtShare" Width="300"/>
<StackPanel Orientation="Horizontal">
<Button
x:Name="btnRead"
Click="btnRead_Click"
Margin="3"
HorizontalAlignment="Left"
Content="读取一个共享的值"/>
<Button
x:Name="btnSave"
Click="btnSave_Click"
Margin="3"
HorizontalAlignment="Right"
Content="写入一个共享的值"/>
</StackPanel>
</StackPanel>
</Grid>
添加后台代码:
private async void btnSave_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(txtShare.Text.Trim())) return;
var sharedFolder1 = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("Folder1"); var shareFile = await sharedFolder1.CreateFileAsync("share.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting); using (Stream stream = await shareFile.OpenStreamForWriteAsync())
{
byte[] content = System.Text.Encoding.UTF8.GetBytes(txtShare.Text.Trim()+" From A ");
await stream.WriteAsync(content, , content.Length);
}
} private async void btnRead_Click(object sender, RoutedEventArgs e)
{
var sharedFolder1 = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("Folder1");
StorageFile shareFile = null;
try
{
shareFile = await sharedFolder1.GetFileAsync("share.txt");
}
catch (Exception exc)
{
await new MessageDialog(exc.Message, "提示").ShowAsync();
} if (shareFile != null)
{
var accessStream = await shareFile.OpenReadAsync();
using (Stream stream = accessStream.AsStreamForRead((int)accessStream.Size))
{
byte[] content = new byte[stream.Length];
await stream.ReadAsync(content, , (int)stream.Length); txtShare.Text = System.Text.Encoding.UTF8.GetString(content, , content.Length);
}
}
}
为了区分两个App存进去的值,我在存储的时候给加上了App标志(A or B),来看下效果:

推荐一个UWP开发群:53078485 大家可以进来一起学习
Win10/UWP新特性系列-GetPublisherCacheFolder的更多相关文章
- 【转】Win10/UWP新特性系列—Web
Internet Explorer Internet Explorer 在Windows 10 升级为Edge模式,是一种交互性和兼容性都很强的新型浏览器,该浏览器相比以前的版本更新了超过2000个操 ...
- Win10/UWP新特性系列—Launcher实现应用间的通信
UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如 ...
- Win10/UWP新特性系列—使用打印机
微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来 ...
- Win10/UWP新特性系列—电池报告
UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的 ...
- Win10/UWP新特性—Drag&Drop 拖出元素到其他App
在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...
- Win10/UWP新特性—SharedStorageAccessManager 共享文件
首先先给大家推荐一个UWP/Win10开发者群:53078485 里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStor ...
- atitit。win7 win8 win9 win10 win11 新特性总结与战略规划
atitit.win7 win8 win9 win10 win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 ...
- Java8新特性系列-默认方法
Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...
- Java8新特性系列-Lambda
转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...
随机推荐
- javascript Demo
var vm=(function(){ var name="jasper"; var changename=function(v){ name=v; }; return { nam ...
- Java文件操作与输入输出流
文件操作 package ch15; import java.io.*; /** * Created by Jiqing on 2016/12/28. */ public class FileTest ...
- M1卡介绍
本文整理自网络. M1卡是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,目前都有国产芯片与其兼容,属于非接触式IC卡.最为重要的优点是可读可 ...
- Web1.0、Web2.0、Web3.0的主要区别
Web1.0:以静态.单向阅读为主,网站内信息可以直接和其他网站信息进行交互,能通过第三方信息平台同时对多家网站信息进行整合使用. Web2.0:以分享为特征的实时网络,用户在互联网上拥有自己的数据, ...
- Java 内存分配全面浅析
本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...
- iOS开发UI篇—Quartz2D使用(矩阵操作)
iOS开发UI篇—Quartz2D使用(矩阵操作) 一.关于矩阵操作 1.画一个四边形 通过设置两个端点(长和宽)来完成一个四边形的绘制. 代码: - (void)drawRect:(CGRect)r ...
- iOS开发UI篇—Quartz2D使用(绘图路径)
iOS开发UI篇—Quartz2D使用(绘图路径) 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径 cgmutablepat ...
- 从一个ISP移至另一个ISP而不改变IP的方案
某客户从一个ISP_A移到了另一个ISP_B.但是,其WEB服务器由于之前对外公布的是IP地址,且无DNS,因此,要求该服务器搬至ISP_B后,用户依然可以访问原来的IP地址,求方案. 假设:ISP_ ...
- git基本使用方法
在本地mac,通过终端命令进入要上传的项目文件夹,也就是.xcodeproj文件所在的目录: 1)echo "# SubmitLocalProject" >> READ ...
- POJ 3041 Asteroids 匈牙利算法,最大流解法,行列为点 难度:1
http://poj.org/problem?id=3041 #include <cstdio> #include <cstring> #include <vector& ...