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 ...
随机推荐
- vs2015手动安装xamarin
1.安装jdk Download the Java JDK v1.7.0 installer to any directory on your disk, double-click the downl ...
- ArrayBlockingQueue
ArrayBlockingQueue是阻塞队列的一种,基于数组实现,长度固定,队尾添加,队首获取, 构造函数: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font ...
- 使用IE11抓包,防止在网页跳转时抓包数据被清除的方法
引:最近在研究使用python实现模拟登陆各大网站,在使用IE11进行抓包分析网站登陆的逻辑结构的时候,发现每次在抓包的时候,当网页跳转的时候,抓包数据会被清除,让我很是郁闷,最终在查阅相关资料以及自 ...
- android 待机流程
以下分析基于android2.2的google源码. 开机启动时,首先执行PhoneWindowManager.systemReady()(这之前的流程不分析).调用KeyguardViewMed ...
- (八)open函数的flag详解
3.1.4.open函数的flag详解13.1.4.1.读写权限:O_RDONLY O_WRONLY O_RDWR(1)linux中文件有读写权限,我们在open打开文件时也可以附带一定的权限说明(譬 ...
- Delphi 使用之dll文件生成与调用
DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...
- Mvc导入导出Excel
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2&g ...
- 【ubuntu】系统设置打不开
如果系统设置打不开,请重新安装gnome-control-centersudo apt-get install gnome-control-center如果设置里只有很少的几个图标请重新安装unity ...
- SG函数 专题练习
[hdu1536][poj2960]S-Nim 题意 题意就是给出一个数组h,为每次可以取石子的数目. 然后给你n堆石子每堆si.求解先手能不能赢? 分析 根据\(h\)数组预处理出\(sg[i]\) ...
- qt5.4.0在windows,32位下的编译, vs2010平台
假设源代码入在D:\3DFrame\qt-everywhere-opensource-src-5.4.0\qt-everywhere-opensource-src-5.4.0 1:首先从官方网站下载源 ...