微软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的更多相关文章

  1. 【转】Win10/UWP新特性系列—Web

    Internet Explorer Internet Explorer 在Windows 10 升级为Edge模式,是一种交互性和兼容性都很强的新型浏览器,该浏览器相比以前的版本更新了超过2000个操 ...

  2. Win10/UWP新特性系列—Launcher实现应用间的通信

    UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如 ...

  3. Win10/UWP新特性系列—使用打印机

    微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来 ...

  4. Win10/UWP新特性系列—电池报告

    UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的 ...

  5. Win10/UWP新特性—Drag&Drop 拖出元素到其他App

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

  6. Win10/UWP新特性—SharedStorageAccessManager 共享文件

    首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStor ...

  7. atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

    atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 ...

  8. Java8新特性系列-默认方法

    Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...

  9. Java8新特性系列-Lambda

    转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...

随机推荐

  1. 用unity3d+cardboard开发一个全景图片查看器

    一.建立全景播放场景: 建立一个unity项目,并建立videoplay场景,在场景中拖入一个球体,将全景照片拉到球体上,自动形成material和texture. 二.创建一个新的表面着色器,并修改 ...

  2. mac os 添加用户到组 命令

    mac os 添加用户到组 命令 dscl localhost 进入组目录 cd /Local/Default/Groups 使用ls 你就可以看到所有的group,? /Local/Default/ ...

  3. centos7 docker mysql56

    yum -y install docker docker pull centos docker run --name=mysqltmp -i -t centos /bin/bash yum -y in ...

  4. css取消input、select默认样式(手机端)

    IOS端: background-color:transparent; border-color:transparent; andorid端: 仅仅使用上面的代码还不够,可以发现select框在某些浏 ...

  5. exception

    SQL> -- 例外 exceptionSQL> -- 1/0SQL> ed已写入 file afiedt.buf 1  declare  2   pnum number := 0; ...

  6. Mac 在命令行中获得Root权限

    Mac 在命令行中获得Root权限 作者 firedragonpzy 13 九月, 2012 2条评论 本文为firedragonpzy原创,转载务必在明显处注明:转载自[Softeware MyZo ...

  7. Head First 设计模式--1策略模式 组合优于继承

    策略模式:第一了算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户. 首先看个错误的面向对象. 假如我们需要写一个关于鸭子的程序,各种类型的鸭子.第一想到的就是建一个 ...

  8. git diff patch

    如何生成patch:修改一个地方,然后git diff > xxx.patch 就会生成一个patch文件,这里的关键似乎是, 源文件的某个模块的版本要和线上发布的最新版本要一致,这样patch ...

  9. linux笔记:shell编程-正则表达式

    正则表达式与通配符(正则表达式匹配字符串,是包含匹配:通配符匹配文件名,是完全匹配.): 基础正则表达式: 正则表达式示例:

  10. 【Jenkins】Windows下安装&访问jenkins

    1. 下载jenkins.war包 下载地址:http://jenkins-ci.org/ 2. 之后在cmd里启动jenkins,命令如下: java -jar (放置war包路径,最好没有中文)j ...